从方法返回通用接口和子实现
问题描述:
我有一个通用接口,其中类型约束是抽象基类。从方法返回通用接口和子实现
所以这些实现可能是不同的实现。
虽然这很好,但当我尝试从设置为返回接口的方法(例如ITest)返回具体实现(例如ITestImplementation)时,这会在Visual Studio中引发有关隐式转换的各种编译时错误。
代码:
ITest<Control>
{
void Execute();
}
我用在不同的地方这个界面,返回如上的方法。也许我应该使用泛型类型的占位符。
这不可能吗?
感谢
答
不是100%肯定你拍摄什么,但检查出协变和逆变的讨论,看看你之情况现在有可能,或者如果你需要等待的C#4.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是类型而不是变量)是完全合法的吗?
谢谢
答
你想要的是通用方差;具体来说,你希望Interface1是协变的。
通用方差不是在C#支持3.这将是C#4你的代码将工作,如果你说
interface Interface1<out T>
但是,您就可以看到需要以这样的方式只,使用T那你想要的接口转换是可以证明安全。
考虑一个例子,看看我的意思是不合法的。假设你有一个实现IList<Mammal>
的对象。它实际上是一个哺乳动物的名单。您希望将其转换为IList<Animal>
,查明“哺乳动物列表可以用作动物列表”。但是你可以在动物列表中插入一条蛇,然后尝试将一条蛇放入哺乳动物列表中,然后崩溃。列表不能安全协变。
如果您可以向编译器证明您的接口对于协变是安全的,那么C#4将允许您这样做。我将在接下来的几周内发布关于我的博客的安全要求的详细说明。
请发布您的代码 – empi 2009-11-17 22:52:02
请发布一个小而完整的例子来说明问题。 – 2009-11-17 22:52:51
我相信这对你来说很合理,但我无法正面或反面。您不仅应该发布演示该问题的代码,还可以查看错误消息。错误消息通常是对问题的正确诊断;如果是,请仔细阅读错误消息。如果他们不是,我需要知道案件是什么,以便我们可以修复误导性的错误消息。 – 2009-11-17 23:08:39