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 ISignature
donde 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.