Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中使用泛型时区分实际值和默认值(T)#_C#_.net_Generics_C# 3.0 - Fatal编程技术网

C# 在C中使用泛型时区分实际值和默认值(T)#

C# 在C中使用泛型时区分实际值和默认值(T)#,c#,.net,generics,c#-3.0,C#,.net,Generics,C# 3.0,我正在创建两个名为 二进制搜索树和双链接列表 我知道泛型不允许我赋值null,因为可能会涉及值类型。但是,如果我将default(T)分配给previousItem和nextItem,在BinarySearchTree的情况下,如何区分真正为节点提供0的用户 公共二进制搜索树(T根) { innerCollection[0]=新的双链接列表(根,默认值(T),默认值(T)); } 这将删除编译时错误,但我不希望将0分配给根节点的previousItem,currentItem。有人能帮我解决这

我正在创建两个名为
二进制搜索树
双链接列表

我知道泛型不允许我赋值
null
,因为可能会涉及值类型。但是,如果我将
default(T)
分配给
previousItem
nextItem
,在
BinarySearchTree
的情况下,如何区分真正为节点提供
0
的用户

公共二进制搜索树(T根)
{
innerCollection[0]=新的双链接列表(根,默认值(T),默认值(T));
}

这将删除编译时错误,但我不希望将
0
分配给根节点的
previousItem
currentItem
。有人能帮我解决这个问题吗?

您的实现中存在漏洞。但是为了回答您的特定问题,您可以将
T
限制为引用类型,从而允许分配
null

另一方面,如果您修复了实现中的bug,那么问题就会消失:

public class DoublyLinkedList<T> : IDoublyLinkedList<T>
{
    private T currentItem;
    private DoublyLinkedList<T> previousItem;
    private DoublyLinkedList<T> nextItem;

    public DoublyLinkedList(T cItem, DoublyLinkedList<T> pItem, DoublyLinkedList<T> nItem)
    {
        currentItem = cItem;
        previousItem = pItem;
        nextItem = nItem;
    }
公共类双链接列表:i双链接列表
{
私人项目;
私有双链接列表先前项;
私有双链接列表nextItem;
公共双链接列表(T cItem、双链接列表pItem、双链接列表nItem)
{
currentItem=cItem;
前一项=pItem;
nextItem=nItem;
}

也就是说,上一个/下一个项目必须是您的包装类,因此总是引用类型,因此在链接列表中可以是
null

,下一个和上一个项目应该是一个节点,而不是存储的实际值。您的
DoubleLinkedList
基本上是一个美化的
元组
。因此,它不是
公共双链接edList(T cItem、T pItem、T nItem)
它应该是
公共双链接列表(T cItem、双链接列表pNode、双链接列表nNode)
…这解决了您的问题,因为上一个项目和下一个项目属于类类型,可以分配给
null
。您发布的代码不实现链接列表。它不提供遍历数据结构的机制,这是任何链接数据结构的一个关键功能。请参阅标记的重复项,以了解如何实现了实际的链接列表;双链接列表只是有一个额外的引用,用于反向链接方向。如前一条评论所述,如果要正确实现该列表,能够区分空链接将是微不足道的。只是出于好奇。为什么不使用现有的?它自.Net 2.0以来就存在。也是对应的对于BinarySearchTree,它是。
public BinarySearchTree(T root)
    {
        innerCollection[0] = new DoublyLinkedList<T>(root, null, null);
    }
public BinarySearchTree(T root)
    {
        innerCollection[0] = new DoublyLinkedList<T>(root, default(T), default(T));
    }
public class DoublyLinkedList<T> : IDoublyLinkedList<T>
{
    private T currentItem;
    private DoublyLinkedList<T> previousItem;
    private DoublyLinkedList<T> nextItem;

    public DoublyLinkedList(T cItem, DoublyLinkedList<T> pItem, DoublyLinkedList<T> nItem)
    {
        currentItem = cItem;
        previousItem = pItem;
        nextItem = nItem;
    }