C# 如何创建既支持引用类型又支持值类型而不使用默认值(T)的泛型

C# 如何创建既支持引用类型又支持值类型而不使用默认值(T)的泛型,c#,generics,C#,Generics,我正在尝试实现基于数组作为数据结构的通用队列 public class ArrayQueue<T> { public T Dequeue() { if (Queue[Tail] == null) return null; T value = Queue[Tail]; Queue[Tail] = null; Tail--;

我正在尝试实现基于
数组
作为数据结构的通用队列

public class ArrayQueue<T>
{
        public T Dequeue()
        {
            if (Queue[Tail] == null)
                return null;

            T value = Queue[Tail];
            Queue[Tail] = null;
            Tail--;
            if (Tail - Head < Queue.Length / (ResizeCoefficient * 2))
                ResizeQueue(Queue.Length / ResizeCoefficient);
            return value;
        }
...
private T[] Queue;
}
公共类数组队列
{
公共T出列()
{
if(队列[Tail]==null)
返回null;
T值=队列[Tail];
队列[Tail]=null;
尾巴--;
if(尾端<队列长度/(调整系数*2))
ResizeQueue(Queue.Length/ResizeCoefficient);
返回值;
}
...
私有T[]队列;
}
如您所见,我使用null作为“空”单元格,而不是
default(T)
。 这是因为如果T是int,
default(int)=0
和0可以是有效输入,而不是空值。因此T必须是引用类型或可为null的
。但我不想让客户机为此烦恼,类应该同时支持
ArrayQueue
ArrayQueue


您能否建议使用泛型类的任何解决方案,该类不受约束,同时能够具有类型为
null
Array

null
也应该是队列中的有效值。它不应该用来跟踪你的尾巴

尝试实现一个计数器或索引,它可以告诉您队列中有多少元素,或者尾部在哪里。使用此选项,您可以插入并返回任何值,包括
null
0
default(T)
,等等


查看的代码可能是一个好主意。

对于值类型,使用Nullable而不是T如何?然后您可以区分未设置和设置为默认值。您可以使用
对象[]
数组而不是
T[]
作为存储。然后强制转换/取消缩放以恢复您的值。我知道,太可怕了。@JamesLucas:你的意思是用
ArrayQueue
,而不是
ArrayQueue
?你所要求的是不可能的。您的
Dequeue
方法返回一个
T
实例,因此如果
T
int
,则不可能返回
null
T
必须是可空值类型,或者
Dequeue
必须返回类型
nullable
。不能两全其美。如果
default(t)
是有效值,那又有什么关系呢?您应该能够跟踪队列的头和尾的位置,而无需使用
null
作为某种标志。不要忘记,
null
通常也是集合中引用类型的“有效”值。