Ora il mio obiettivo era quello di avere una coppia con un tipo di base e una definizione di tipo (Requisito A). Per la definizione del tipo voglio utilizzare l'ereditarietà (Requisito B). L'uso dovrebbe essere possibile, senza conoscenze esplicite sul tipo di base (Requisito C).
Dopo ora so che i vincoli gernic non vengono utilizzati per risolvere il tipo di ritorno generica, ho sperimentato un po ':
introducte
Ok li ha lasciati 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
}
}
fine, ma questa soluzione raggiunge non requriement B.
successivo tentativo:
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!!
}
}
Bello! Ora il compilatore può inferire i tipi di ritorno generici. Ma non mi piace. Altro tentativo:
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...
}
}
La mia soluzione finale è quella di avere qualcosa di simile ISignature<B, C>
, dove B ist il tipo di base e C la definizione ...
magari aggiungendo l'errore che si ottiene ... – vulkanino
risposta di Eric Lippert qui, insieme al suo post sul blog a cui si collega, è una buona spiegazione del perché. Fondamentalmente, se ricordo correttamente, il compilatore non dedurrà i tipi usando i vincoli generici.http://stackoverflow.com/questions/3630153/generic-extension-method-type-argument-cannot-be-inferred-from-the-usage/3630202#3630202 –