Jon*_*eet 12
如果您使用C#4并且IFoo声明为:
public interface IFoo<out T>
Run Code Online (Sandbox Code Playgroud)
假设Bar实现IBar和Foo<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 关于泛型差异的长篇博客系列,了解更多信息.