c# - 在泛型中使用什么类型进行装箱

标签 c# generics .net-2.0 struct

我用 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/

相关文章:

c# - WCF NetTcpBinding 缓冲与流式性能问题

c# - 在 C# 中,如何检查 File.Delete() 是否会在不尝试的情况下成功?

c# - 如果长度恰好为一个,或者否则为默认值,我如何获得 IEnumerable 的第一个值?

c# - FileSystemWatcher 和网络断开连接?

c# - 在 gridview 中获取特定的数据行?

delphi - 如何将通用过程 TProc<T1,T2> 作为参数传递并调用它?

java - List<?> 与 List<Object> 不同时的示例

c# - 有没有办法从 ExcelWorkBook 中获取 byte[] 而无需先将其保存到磁盘

c# - System.Array.CopyTo() 和 System.Array.Clone() 的区别

c# - 如何与Windows服务通信?