2009-11-17 65 views
0

我有一個通用接口,其中類型約束是抽象基類。從方法返回通用接口和子實現

所以這些實現可能是不同的實現。

雖然這很好,但當我嘗試從設置爲返回接口的方法(例如ITest)返回具體實現(例如ITestImplementation)時,這會在Visual Studio中引發有關隱式轉換的各種編譯時錯誤。

代碼:

ITest<Control> 
{ 
    void Execute(); 
} 

我用在不同的地方這個界面,返回如上的方法。也許我應該使用泛型類型的佔位符。

這不可能嗎?

感謝

+0

請發佈您的代碼 – empi 2009-11-17 22:52:02

+1

請發佈一個小而完整的例子來說明問題。 – 2009-11-17 22:52:51

+3

我相信這對你來說很合理,但我無法正面或反面。您不僅應該發佈演示該問題的代碼,還可以查看錯誤消息。錯誤消息通常是對問題的正確診斷;如果是,請仔細閱讀錯誤消息。如果他們不是,我需要知道案件是什麼,以便我們可以修復誤導性的錯誤消息。 – 2009-11-17 23:08:39

回答

0

道歉,代碼是在工作,但我在家裏重新錯誤:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using ArtOfTest.WebAii.Controls.HtmlControls; 

namespace iCrawler.Code 
{ 
    interface Interface1<T> where T : HtmlControl 
    { // May use T for future methods which will be generic in nature eg work with a generic collection of instances of T (not depicted in the method signature below) 
     void DoStuff(); 
    } 

    class Child1 : Interface1<ArtOfTest.WebAii.Controls.HtmlControls.HtmlAnchor> 
    { 
     public void DoStuff() 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    class Test 
    { 

     public Interface1<HtmlControl> ReturnExperiment() 
     { 
      Child1 child1 = new Child1(); 
      return child1; 
     } 

    } 
} 

在 「返回child1」 行,我得到的錯誤如下:

Error 1 Cannot implicitly convert type 'iCrawler.Code.Child1' to 'iCrawler.Code.Interface1<ArtOfTest.WebAii.Controls.HtmlControls.HtmlControl>'. An explicit conversion exists (are you missing a cast?) C:\Projects\Current\iCrawler\iCrawler\iCrawler\Code\Interface1.cs 28 20 iCrawler 

此外,我很確定返回Child1(其中Child1是類型而不是變量)是完全合法的嗎?

謝謝

3

你想要的是通用方差;具體來說,你希望Interface1是協變的。

通用方差不是在C#支持3.這將是C#4你的代碼將工作,如果你說

interface Interface1<out T> 

但是,您就可以看到需要以這樣的方式只,使用T那你想要的接口轉換是可以證明安全。

考慮一個例子,看看我的意思是不合法的。假設你有一個實現IList<Mammal>的對象。它實際上是一個哺乳動物的名單。您希望將其轉換爲IList<Animal>,查明「哺乳動物列表可以用作動物列表」。但是你可以在動物列表中插入一條蛇,然後嘗試將一條蛇放入哺乳動物列表中,然後崩潰。列表不能安全協變。

如果您可以向編譯器證明您的接口對於協變是安全的,那麼C#4將允許您這樣做。我將在接下來的幾周內發佈關於我的博客的安全要求的詳細說明。

相關問題