2015-11-15 13 views
11

ho questo interface:Perché un metodo generico <T> con un "dove T: classe" vincolo di accettare un'interfaccia

public interface ITestInterface 
{ 
    int TestInt { get; set; } 
} 

e questo metodo generico (con un vincolo T : class):

public void Test<T>() where T : class 
{ 
    // DoSomething 
} 

e questa chiamata:

Test<ITestInterface>(); 

e tutto compila e ru ns mentre uno interfacenon è a class (o è?).

Perché succede?

ho visto questo sul mio WCF classe proxy:

public partial class TestServiceClient: 
    System.ServiceModel.ClientBase<TestNamespace.ITestService>, TestNamespace.ITestService 

dove ClientBase<T> ha questa definizione:

public abstract class ClientBase<TChannel> : 
    ICommunicationObject, IDisposable where TChannel : class 
+0

Vedere le risposte qui: http://stackoverflow.com/questions/1096568/how-can-i-use-interface-as-ac-sharp-generic-type-constraint –

+1

Un'interfaccia non è una classe, ma è un contratto, una promessa che aspetto ha una classe. Quindi, se si dispone di una dichiarazione con un'interfaccia, il codice chiamante dovrebbe utilizzare un'istanza di un oggetto che implementa tale interfaccia. – GolezTrol

+0

@o_weisman - Grazie amico, non lo trovo su google. –

risposta

9

Il vincolo class significa che il tipo deve essere un tipo di riferimento, non necessariamente un classe.

dalle specifiche del linguaggio C#:

Il vincolo di tipo di riferimento specifica che un argomento di tipo utilizzato per il parametro tipo deve essere un tipo di riferimento. Tutti i tipi di classe, i tipi di interfaccia, i tipi di delegati, i tipi di array e i parametri di tipo noti per essere un tipo di riferimento (come definito di seguito) soddisfano questo vincolo.

Fondamentalmente, significa che il tipo non può essere un tipo di valore. tipi

di valore in grado di implementare le interfacce troppo, ma gettando un tipo di valore a un'interfaccia fa sì che il valore da inscatolato

IComparable i = 0; 

Ora i memorizza un riferimento a una scatola 0.

Problemi correlati