为什么我不能转换FooIFoo< IBar>

本文关键字:Bar IFoo IBar Foo 不能 转换 为什么 | 更新日期: 2023-09-27 18:08:41

为什么不能将Foo<Bar>转换为IFoo<IBar>

如果我尝试,我得到:

没有从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关于一般差异的长博客系列以获得更多信息。

要做到这一点,需要满足以下三个条件:

  1. Bar必须执行IBar
  2. Foo必须执行IFoo
  3. IFoo<T>必须在T中协变(如:IFoo<out T>)

这取决于你正在编译的c#版本。

通用协方差和逆变是在c#和。net 4中引入的:http://msdn.microsoft.com/en-us/library/dd799517.aspx

相关文章: