Saltar al contenido

Los argumentos de tipo para el método no se pueden inferir del uso

Luego de de esta larga selección de información hemos podido solucionar este atasco que pueden tener ciertos los lectores. Te ofrecemos la solución y esperamos serte de mucha ayuda.

Solución:

Get toma dos tipos de argumentos. Cuando usted llama service.Get(new Signatur()); ¿Cómo sabe el compilador qué T ¿es? Tendrá que pasarlo explícitamente o cambiar algo más sobre sus jerarquías de tipos. Pasarlo explícitamente se vería así:

service.Get(new Signatur());

La respuesta de Kirk es correcta. Como regla general, no tendrá suerte con la inferencia de tipos cuando la firma de su método tenga menos tipos de parametros de lo que tiene parámetros de tipo genérico.

En tu caso particular, parece que podrías posiblemente mueve el T escriba el parámetro al nivel de clase y luego obtenga la inferencia de tipo en su Get método:

class ServiceGate

    public IAccess Get(S sig) where S : ISignatur
    
        throw new NotImplementedException();
    

Luego, el código que publicó con el error CS0411 podría reescribirse como:

static void Main()

    // Notice: a bit more cumbersome to write here...
    ServiceGate service = new ServiceGate();

    // ...but at least you get type inference here.
    IAccess access = service.Get(new Signatur());

Ahora mi objetivo era tener un par con un tipo base y una definición de tipo (Requisito A). Para la definición de tipo, quiero usar la herencia (Requisito B). El uso debe ser posible, sin conocimiento explícito sobre el tipo base (Requisito C).

Después de saber que las restricciones gernicas no se usan para resolver el tipo de retorno genérico, experimenté un poco:

Bien, introduzcamos Get2:

class ServiceGate

    public IAccess Get1(C control) where C : ISignatur
    
        throw new NotImplementedException();
    

    public IAccess, T> Get2(ISignatur control)
    
        throw new NotImplementedException();
    


class Test

    static void Main()
    
        ServiceGate service = new ServiceGate();
        //var bla1 = service.Get1(new Signatur()); // CS0411
        var bla = service.Get2(new Signatur()); // Works
    

Bien, pero esta solución no alcanza el requisito B.

Próximo intento:

class ServiceGate

    public IAccess Get3(C control, ISignatur iControl) where C : ISignatur
    
        throw new NotImplementedException();
    



class Test

    static void Main()
    
        ServiceGate service = new ServiceGate();
        //var bla1 = service.Get1(new Signatur()); // CS0411
        var bla = service.Get2(new Signatur()); // Works
        var c = new Signatur();
        var bla3 = service.Get3(c, c); // Works!! 
    

¡Lindo! Ahora el compilador puede inferir los tipos de devolución genéricos. Pero no me gusta Otro intento:

class IC

    public IC(A a, B b)
    
        Value1 = a;
        Value2 = b;
    

    public A Value1  get; set; 

    public B Value2  get; set; 


class Signatur : ISignatur

    public string Test  get; set; 

    public IC> Get()
    
        return new IC>(this, this);
    


class ServiceGate

    public IAccess Get4(IC> control) where C : ISignatur
    
        throw new NotImplementedException();
    


class Test

    static void Main()
    
        ServiceGate service = new ServiceGate();
        //var bla1 = service.Get1(new Signatur()); // CS0411
        var bla = service.Get2(new Signatur()); // Works
        var c = new Signatur();
        var bla3 = service.Get3(c, c); // Works!!
        var bla4 = service.Get4((new Signatur()).Get()); // Better...
    

Mi solución final es tener algo como ISignaturedonde B es el tipo base y C la definición…

Comentarios y puntuaciones

Puedes añadir valor a nuestra información tributando tu experiencia en las observaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *