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
通常也是集合中引用类型的“有效”值。