http://stackoverflow.com/questions/12424537/why-ienumerablet-is-defined-as-ienumerableout-t-not-ienumerablet
The out
type parameter specifier denotes covariance.
In practice,
If I define two interfaces.
ISomeInterface<T>{}
ISomeCovariantInterface<out T>{}
Then, I implement them like this.
SomeClass<T>:ISomeInterface<T>,ISomeCovariantInterface<T>{}
Then I try to compile this code,
ISomeCovariantInterface<object>=newSomeClass<string>();// works
ISomeInterface<object>=newSomeClass<string>();// fails
The is because the covariant interface allows more derived instances, where as, the standard interface does not.
public interface ISomeInterface<T> { } public interface ISomeCovariantInterface<out T> { } public class SomeClass<T> : ISomeInterface<T>, ISomeCovariantInterface<T> { } var obj = new SomeClass<string>(); ISomeCovariantInterface<object> obj1 = obj;// works ISomeCovariantInterface<string> obj2 = obj;// works ISomeInterface<string> obj3 = obj;//work //ISomeInterface<object> obj4 = obj;//不可编译