空通用类型c#

pan*_*ohn 1 c# generics null

public class Node<E> : IPosition<E>
{
    private E element;
    public Node<E> PrevNode { get; set; }
    public Node<E> NextNode { get; set; }

    //Constructor
    public Node(E e, Node<E> p, Node<E> n)
    {
        element = e;
        PrevNode = p;
        NextNode = n;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有上面的Node类,当我创建一个新的节点对象时,我想要这样做:

Node<E> n = new Node<E>(null, null, null);
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为所有类型都不能为空.让我感到惊讶的是,当我在Java中尝试类似的东西时,它是有效的.我在Stack Overflow上看到了一些相关的问题,但是他们没有给出我想要的结果.我不想用default(E).

15e*_*153 9

您需要一个通用类型约束,声明E必须是引用类型:

public class Node<E> : IPosition<E> where E : class
Run Code Online (Sandbox Code Playgroud)

也就是说,除非您还E因其他原因需要成为值类型.如果是这种情况,您需要牺牲一项要求或另一项要求.

可以为Nullable值类型是一个选项:对于您的原始版本,缺少类型约束(因为Nullable<T>它本身就是一个值类型),您可以使用int?.以下代码为我编译而没有约束:

var y = new Node<int?>(null, null, null);
Run Code Online (Sandbox Code Playgroud)

int?不是int,但它很接近.