Why IEnumerable<T> is defined as IEnumerable<out T>, not IEnumerable<T>

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;//不可编译

 

 

 

posted @ 2013-05-17 10:40  I'm CY  阅读(257)  评论(0编辑  收藏  举报