2009-11-17 60 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将允许您这样做。我将在接下来的几周内发布关于我的博客的安全要求的详细说明。

相关问题