为什么无法将 Foo<Bar>
转换为 IFoo<IBar>
。
如果尝试转换,会出现以下错误:
无法将
Foo<Bar>
隐式引用转换为IFoo<IBar>
IFoo
声明为以下形式,则它将起作用:public interface IFoo<out T>
假设Bar
实现IBar
,而Foo<T>
实现IFoo<T>
。
然而,只有在安全的情况下才能这样声明。如果T
值既作为输入又作为输出进入API,则不安全。例如:
public interface IFoo<T>
{
T Value { get; set; }
}
如果这里是协变的话,那么你就可以写成:
T 不能被协变化,因为这样会有问题:
public class StringFoo : IFoo<string>
{
public T Value { get; set; }
}
IFoo<string> fooString = new StringFoo(); // That's fine
IFoo<object> fooObject = fooString; // This isn't, because...
fooObject.Value = new Object(); // ... this would violate type safety
阅读Eric Lippert关于泛型协变和逆变的长篇博客系列,可以获得更多信息。
Bar
必须实现 IBar
Foo
必须实现 IFoo
IFoo<T>
必须在 T
上是协变的(像这样:IFoo<out T>
)这取决于您正在编译的C#版本。
C#和.NET 4引入了通用协变性和逆变性:http://msdn.microsoft.com/en-us/library/dd799517.aspx
Foo
是否实现了IFoo
接口,Bar
是否实现了IBar
接口? - Clive