为什么我不能转换FooIFoo< IBar>
本文关键字:Bar IFoo IBar Foo 不能 转换 为什么 | 更新日期: 2023-09-27 18:08:41
为什么不能将Foo<Bar>
转换为IFoo<IBar>
如果我尝试,我得到:
没有从
Foo<Bar>
到IFoo<IBar>
的隐式引用转换
如果你使用c# 4和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