Eri*_*ert 111
假设你有一个C<T>在T中具有协变性的类.它的实现是什么样的?T必须出来.这意味着C<T>不能有任何采用T的方法,带有setter的T类型的任何属性,或任何类型为T的字段,因为字段在逻辑上与属性setter相同; T进去了.
就T而言,使用协变类构建的唯一有用的东西是不可变的.现在,我认为拥有协变的不可变列表和堆栈以及类型的类型将是非常棒的.但是这个特征并不是那么明显,以至于它可以明确证明在使类型系统本身支持协变不可变类类型时的大量开支.
上面的评论询问了一个有用的例子.考虑以下草图:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
假设你有协变类.现在你可以说
Stack<string> strings = null;
strings = strings.Push("hello");
strings = strings.Push("goodbye");
Stack<object> objects = strings;
objects = objects.Push(123);
Run Code Online (Sandbox Code Playgroud)
嘿,我们只是把一个整数推到一堆字符串上,但一切都很好!没有理由为什么这不是类型安全的.在可变数据结构上违反类型安全的操作可以在不可变数据结构上安全地协变.
| 归档时间: |
|
| 查看次数: |
4119 次 |
| 最近记录: |