为什么C#4.0中的类不存在一般差异?

如果我们有它的接口,为什么我们也没有它的类? 使用它会引起什么问题?

谢谢

假设你有一个在T中协变的C<T>类。它的实现是什么样的? T必须只出去。 这意味着C<T>不能有任何方法使用T,带有setter的Ttypes的任何属性, 或者Ttypes的任何字段 ,因为字段在逻辑上与属性设置者相同; T进去了。

就T而言,你可以用一个协变类构build的唯一有用的东西是不变的。 现在,我认为拥有协变的不可变列表和堆栈以及类types是非常棒的。 但是这个特性并不是那么明显,以至于它明显certificate了使types系统原生支持协变不变类types的巨大开销。

上面的评论要求提供一个有用的例子。 考虑下面的草图:

 sealed class Stack<out T> { private readonly T head; private readonly Stack<T> tail; public T Peek() { return head; } public Stack<T> Pop() { return tail; } public Stack(T head, Stack<T> tail) { this.tail = tail; this.head = head; } } static class StackExtensions { public static Stack<T> Push<T>(this Stack<T> tail, T head) { return new Stack<T>(head, tail); } public static bool IsEmpty<T>(this Stack<T> stack) { return stack == null; } } 

假设你有协变类。 现在你可以说

 Stack<string> strings = null; strings = strings.Push("hello"); strings = strings.Push("goodbye"); Stack<object> objects = strings; objects = objects.Push(123); 

嘿,我们只是把一个整数推到一堆string上,但是一切正常! 没有理由为什么这不是types安全的。 在可变数据结构上违反types安全性的操作可以在不可变数据结构上安全协变。

看看这个msdn文章: genericstypes的差异(C#编程指南)

.NET团队以及C#和VB.NET团队的资源有限,他们在协同和逆变方面所做的工作解决了大部分现实世界的问题 。 types系统是非常复杂的,如果在其他情况下导致不安全的代码,在99.9999%的情况下工作的解决scheme不够好。

我不认为支持类方法的协变和逆变规格(例如“in”/“out”)的成本/时间具有足够的价值。 由于缺乏多类inheritance,我可以看到很less的情况是可用的。

你宁愿再等6个月才能得到这个支持吗?


另一种想法是在.net中

  • 接口 /委托 – 用于模拟应用程序的概念types系统
  • Class用于实现上述types
  • 在继续执行上述操作时, 类inheritance用于减less代码重复
  • 协同和反变化是关于应用程序的概念types系统