2013-11-20 47 views
0

我有一個關於仿製藥的問題,使用創建形而下類時施放接口:通用接口約束


namespace MyNamespace 
{ 
    interface ITest 
    { 

    } 

    class Timpl : ITest 
    { 

    } 

    class Test<T> where T : ITest 
    { 
     public T get() 
     { 
      return default(T); 
     } 
    } 

    class MyClass 
    { 
     public MyClass() 
     { 
      Test<ITest> s = new Test<Timpl>(); //Does not compile 
     } 
    } 
} 

我的合作和逆變讀了,但我一定是失去了一些東西,或者它沒有任何關係做我正在嘗試的事情,或者它只是沒有工作,我試圖做的。

雖然我可以從測試轉換到測試,因爲TImple繼承自ITest。

+0

你有沒有發現任何有用的提供的答案嗎?不要忘了在答案分數下面勾選綠色標記將其標記爲已接受。 –

回答

0

我想我理解你的問題。你可以閱讀有關協變和逆變以下MSDN鏈接:http://msdn.microsoft.com/en-us/library/vstudio/ee207183.aspx

我對你的問題的解決方案看起來像這樣

接口ITEST { }

class TImpl:ITest 
{ 

} 

interface ITest<out T> 
{ 
    T get(); 
} 

class Test<T>:ITest<T> 
      where T:ITest 
{ 
    public T get() 
    { 
     return default(T); 
    } 
} 

正如你所看到的,我已經添加和接口通過您的測試類,我已經標記類型參數,噸,出。現在,你可以做到以下幾點:

ITest<ITest> t = new Test<TImpl>(); 

我希望這有助於

3

應該

class Test<T> where T : ITest 
{ 
    public T get() 
    { 
     return default(T); 
    } 
} 

然後創建的Test實例像

var s = new Test<Timpl>(); 

編輯:基於下面的評論

。好的,現在你正在處理協變和逆變。如果你需要指定

Test<ITest> s = new Test<Timpl>(); 

那麼就不能工作,因爲的接口和委託只有泛型參數可以被標記爲協變或逆變。

但是,你可以通過使Test實現一個接口來解決它。

interface ITestClass<out T> 
{ 
    T get(); 
} 

class Test<T> : ITestClass<T> where T : ITest 
{ 
    public T get() 
    { 
     return default(T); 
    } 
} 

ITestClass<ITest> s = new Test<Timpl>(); // Does compile 
+0

對不起,但沒有注意到它沒有寫出greaterthen和lessthen標籤。所以這個例子現在有點不同了。 – MazeezaM

+0

@MazeezaM我更新了我的答案。 –

+0

增加了一個工作解決方案。 –

1

試試這個。

namespace MyNamespace 
{ 
    interface ITest 
    { 
    } 

    class Timpl : ITest 
    { 
    } 

    class Test<T> where T : ITest 
    { 
     public T get() 
     { 
      return default(T); 
     } 
    } 

    public class mycls : ITest 
    { 
    } 

    class MyClass 
    { 
     public MyClass() 
     { 
      Test<mycls> s = new Test<mycls>(); //will compile 
     } 
    } 
} 
+0

爲什麼在OP已經實現了ITest時創建'mycls'?似乎他只是不知道如何使用它。 –

+0

對不起,但沒有注意到它沒有寫出greaterthen和lessthen標籤。所以這個例子現在有點不同了。 – MazeezaM