Tag: 协变

为什么IEnumerable <T>在C#4中是协变的?

在早期版本的C# IEnumerable中定义如下: public interface IEnumerable<T> : IEnumerable 由于C#4的定义是: public interface IEnumerable<out T> : IEnumerable 只是为了让LINQexpression式中的恼人的表演消失吗? 这不会像C#中的string[] <: object[] (破坏数组方差)一样引入相同的问题吗? 从兼容性的angular度来看,如何增加协变? 早期的代码仍然可以在更高版本的.NET上工作,或者在这里重新编译吗? 那反过来呢? 之前的代码是否使用这个接口在所有情况下都是严格不变的,或者现在某些用例可能会有所不同?

为什么没有关于Haskell(与Scala或C#相对)的协变和反变化的讨论?

我知道什么types的协变和逆变。 我的问题是为什么我在研究Haskell(而不是Scala)时还没有遇到这些概念的讨论? Haskell的视图types与Scala或C#相比有一个根本的区别,我想说明一下这个区别是什么。 或者,也许我错了,我只是没有足够的Haskell学习:-)

generics:列表<? 扩展Animal>与List <Animal>相同?

我只是想了解Javagenerics中的extends关键字。 List<? extends Animal> List<? extends Animal>意味着我们可以填充List任何对象是 Animal 那么下面也不会有同样的意思: List<Animal> 有人能帮我了解上述两者之间的区别吗? 对我来说这只是声音冗余而已。 谢谢!

C#:重写返回types

有没有办法在C#中覆盖返回types? 如果是的话,如果不是为什么,什么是推荐的做法呢? 我的情况是,我有一个抽象的基类和后裔的接口。 我想这样做(好吧不是真的,但作为一个例子!): public interface Animal { Poo Excrement { get; } } public class AnimalBase { public virtual Poo Excrement { get { return new Poo(); } } } public class Dog { // No override, just return normal poo like normal animal } public class Cat { public override RadioactivePoo Excrement { […]