Ahora mi objetivo era tener un par con un tipo de base y una definición de tipo (Requisito A). Para la definición de tipo, quiero usar herencia (Requisito B). El uso debe ser posible, sin conocimiento explícito sobre el tipo base (Requisito C).
Después de que sé ahora que las limitaciones gernic no se utilizan para resolver el tipo de retorno genérico, que experimentó un poco:
introducte
nos dejó Ok Get2:
class ServiceGate
{
public IAccess<C, T> Get1<C, T>(C control) where C : ISignatur<T>
{
throw new NotImplementedException();
}
public IAccess<ISignatur<T>, T> Get2<T>(ISignatur<T> 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 esto alcances de soluciones no requriement B.
siguiente intento:
class ServiceGate
{
public IAccess<C, T> Get3<C, T>(C control, ISignatur<T> iControl) where C : ISignatur<T>
{
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!!
}
}
¡Agradable! Ahora el compilador puede inferir los tipos de devolución genéricos. Pero no me gusta Otro intento:
class IC<A, B>
{
public IC(A a, B b)
{
Value1 = a;
Value2 = b;
}
public A Value1 { get; set; }
public B Value2 { get; set; }
}
class Signatur : ISignatur<bool>
{
public string Test { get; set; }
public IC<Signatur, ISignatur<bool>> Get()
{
return new IC<Signatur, ISignatur<bool>>(this, this);
}
}
class ServiceGate
{
public IAccess<C, T> Get4<C, T>(IC<C, ISignatur<T>> control) where C : ISignatur<T>
{
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 así como ISignature<B, C>
, donde B no está en el tipo de base y la definición C ...
tal vez añadiendo el error que se obtiene ... – vulkanino
respuesta de Eric Lippert aquí, junto con su publicación de blog con la que se vincula, es una buena explicación de por qué. Básicamente, si recuerdo correctamente, el compilador no deducirá tipos utilizando restricciones genéricas.http://stackoverflow.com/questions/3630153/generic-extension-method-type-argument-cannot-be-inferred-from-the-usage/3630202#3630202 –