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

mag*_*gol 3 .net c#

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

如果我尝试我得到:

没有隐式引用转换从Foo<Bar>IFoo<IBar>

Jon*_*eet 12

如果您使用C#4并且IFoo声明为:

public interface IFoo<out T>
Run Code Online (Sandbox Code Playgroud)

假设Bar实现IBarFoo<T>实现IFoo<T>.

但是,如果它是安全的,它只能被声明.这是不是安全的,如果T值"进入"的API,以及出来.例如:

public interface IFoo<T>
{
    T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这在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
Run Code Online (Sandbox Code Playgroud)

阅读Eric Lippert 关于泛型差异长篇博客系列,了解更多信息.