为什么我不能转换 Foo<Bar>
至 IFoo<IBar>
.
如果我尝试我得到:
There is no implicit reference conversion from
Foo<Bar>
toIFoo<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 的 long blog series on generic variance了解更多信息。
关于c# - 为什么我不能将 Foo<Bar> 转换为 IFoo<IBar>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7444166/