Si chiede, "non è possibile cambiare TUTTI i riferimenti di T
in questa classe con ISomething
?" Quindi penso che si intende per confrontare:
public class MyClass<T> where T : ISomething
{
public T MyProperty { get; set; }
}
Con:
public class MyClass
{
public ISomething MyProperty { get; set; }
}
Nel secondo esempio, MyProperty
è garantita solo per essere un esempio di ISomething
. Nel primo esempio, MyProperty
è qualsiasi sia T
, anche se si tratta di un sottotipo specifico di ISomething
. Si consideri una concreta attuazione di ISomething
:
public class MySomething : ISomething
{
public string MyOtherProperty { get; set; }
}
Ora, se usiamo il primo, generico, ad esempio, potremmo avere:
MyClass<MySomething> myClass = new MyClass<MySomething>();
Console.WriteLine(myClass.MyProperty.MyOtherProperty);
D'altra parte, se abbiamo usato il secondo esempio, non sarebbe in grado di accedere MyOtherProperty
poiché è noto solo per essere un ISomething
:
MyClass myClass = new MyClass();
Console.WriteLine(myClass.MyProperty.MyOtherProperty); // Won't compile, no property "MyOtherProperty"
Su una nota diversa, la ragione questi vincoli tipo sono utili è che è possibile fare riferimento a MyProperty
(tipo T
) e accedere ai membri di ISomething
. In altre parole, se ISomething
sono state dichiarate come:
public interface ISomething
{
public string SomeProperty { get; set; }
}
allora si potrebbe accedere MyProperty.SomeProperty
. Se hai omesso lo where T : ISomething
, non saresti in grado di accedere a SomeProperty
poiché T
sarebbe noto solo per il tipo object
.
http://msdn.microsoft.com/en-us/library/d5x73970.aspx – zebrabox