用于整型和浮点型的 C# 模板

本文关键字:模板 浮点型 整型 用于 | 更新日期: 2023-09-27 18:33:34

>我有两个类,一个用于浮点数,一个用于int。他们的代码完全相同,我想编写一个与 int 和 float 兼容的模板类,以便不只用不同的类型复制此代码。

这是我的班级:

namespace XXX.Schema
{
    public abstract class NumericPropDef< NumericType > : PropDef
        where NumericType : struct, IComparable< NumericType >
    {
        public NumericType? Minimum { get; protected set; }
        public NumericType? Maximum { get; protected set; }
        public NumericType? Default { get; protected set; }
        public NumericPropDef() : base() { }
        public void SetMinimum( NumericType? newMin )
        {
            if( null != newMin && null != Maximum && (NumericType) newMin > (NumericType) Maximum )
                throw new Exception( "Minimum exceeds maximum" );
            Minimum = newMin;
        }
        public void SetMaximum( NumericType? newMax )
        {
            if( null != newMax && null != Minimum && (NumericType) newMax < (NumericType) Minimum )
                throw new Exception( "Maximum is below minimum" );
            Maximum = newMax;
        }
        public void SetDefault( NumericType? def )
        {
            Default = def;
        }
    }
}

但是由于我不知道的原因,我收到以下错误:

error CS0019: Operator '>' cannot be applied to operands of type 'NumericType' and 'NumericType'

我习惯于C++模板,但不习惯 C# 模板,所以我在这里有点迷茫。可能是什么原因呢?谢谢。

用于整型和浮点型的 C# 模板

在不指定任何其他内容的情况下,假定任何泛型参数(例如您的NumericType(都具有与System.Object相同的功能。为什么?好吧,因为类的用户可能会System.Object传递给 NumericType 参数。因此,不能保证传递给该泛型参数的类型支持 > 运算符,因此编译器不允许使用它。

现在,您NumericType有所限制,因为您要求传递给NumericType的任何类型都IComparable<T>实现并且是一个结构。但是,这些限制都不保证存在>运算符,因此您仍然无法使用它。

在特定情况下,您可能希望使用 CompareTo 方法,该方法在传递给NumericType的任何类型上的可用性由您要求类型实现 IComparable<T> 来保证。但是请注意,像这样,您的类也可以用于与数字无关的其他类型的负载,如果这会给您带来问题。

通常,在 C# 中无法正确回答查找允许用户提供数值类型的限制的特定请求,因为 C#(或一般的 CLI(中的数值类型不会从数值类型的公共基类继承。