我用 C# (.NET 2.0) 编写了一个简单的抽象泛型类,我最好将其限制为仅引用类型,这样我就可以用 null 表示没有值。但是,我也想使用 long 和 decimal 等类型,为什么不允许 null(毕竟是结构)。我考虑过上课
public abstract Field<Nullable<T>>
{
}
但这会阻止我使用字符串类型,它是一个类。我怎样才能把我的小数和长数装箱,这样我就可以在这个泛型中使用它们。
abstract class Field<T>
{
private int _Length = 1;
private bool _Required = false;
protected T _Value; //= null;
public int Length
{
get { return _Length; }
private set
{
if (value < 1) throw new ArgumentException("Field length must be at least one.");
_Length = value;
}
}
public bool Required
{
get { return _Required; }
private set { _Required = value; }
}
public abstract string GetFieldValue();
public abstract void ParseFieldValue(string s);
public virtual T Value
{
get { return _Value; }
set
{
if (value == null && Required)
throw new ArgumentException("Required values cannot be null.");
_Value = value;
}
}
}
请注意,我需要以不同方式表示数字 0 和 null。因此 default(T) 将不起作用。
最佳答案
泛型(以及其他)的全部意义在于避免装箱。参见 this :
private bool _Required = false;
protected T _Value = default(T);
如果您需要区分“0”和“未设置”,object
是您唯一的出路:
protected object _Value;
然后是开箱-开箱-开箱-开箱。
关于c# - 在泛型中使用什么类型进行装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852400/