2015-11-15 9 views
11

を受け入れる私はこのinterface持っている:なぜ "ここで、T:クラス" と総称<T>方法ない制約はインタフェース

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

と(T : class制約付き)この一般的な方法:

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

とこの呼び出し:

Test<ITestInterface>(); 

すべてがコンパイルされ、ru interfaceであり、class(またはそれですか?)ではありません。

どうしてですか?

は、私が最初に私のWCFプロキシクラスでこれを見た:

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

回答を参照してください:http://stackoverflow.com/questions/1096568/how-can-i-use-interface-as-ac-sharp-generic-type-constraint –

+1

インターフェイスはクラスではありませんが、契約、クラスのように見える約束です。したがって、インタフェースを持つ宣言がある場合、呼び出しコードはそのインタフェースを実装するオブジェクトのインスタンスを使用する必要があります。 – GolezTrol

+0

@o_weisman - ありがとうございました。グーグルで見つけられませんでした。 –

答えて

9

class制約はタイプが必ずしも参照型を、しなければならないことを意味しますClientBase<T>はこの定義を持っている

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

クラス。 C#言語仕様から

参照型制約が型パラメータに使用される型引数が参照型でなければならないことを指定します。すべてのクラス型、インタフェース型、デリゲート型、配列型、および参照型(以下で定義)と呼ばれる型パラメータは、この制約を満たします。

基本的には、その型を値型にすることはできません。

値型もインターフェイスを実装するが、インターフェイスに値型をキャストする値が

IComparable i = 0; 

i格納箱入り0への参照を箱詰めさせることができます。

関連する問題