用于在实现该接口的类中强制执行数字类型的接口

时间:2015-02-18 14:31:52

标签: c# generics numerical-methods

有一些技巧可以强制通用类只能使用数字类型(参见this

我正在创建一个库,我最终在许多类定义中编写where T : struct, IComparable ...。我想创建一个这样的空接口:

public interface INumeric<T> 
    where T :
        struct, 
        IComparable,
        IComparable<T>,
        IConvertible,
        IEquatable<T> { }

然后在我的泛型类中实现该接口:

public struct StepSize<T> : INumeric<T>

但是当我尝试将数字与

进行比较时
if (value.CompareTo(default(T)) <= 0)

我收到错误:

  

'T'不包含'CompareTo'...

的定义

为什么我收到错误?我已在界面中限制T的类型,因此T必须为IComparable

编辑:这里有两个班级

namespace NumericalAlgorithms
{
    using System;

    public interface INumeric<T>
        where T :
            struct, 
            IComparable,
            IComparable<T>,
            IConvertible,
            IEquatable<T>
    { }
}

namespace NumericalAlgorithms.NumericalMethods
{
    using System;

    public struct StepSize<T> : INumeric<T>
    {
        public T Value
        {
            get;
            private set;
        }

        public StepSize(T value)
            : this()
        {
            if (value.CompareTo(default(T)) <= 0)
                throw new Exception("The step size must be greater than zero.");

            this.Value = value;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

尝试替换

public struct StepSize<T> : INumeric<T>

通过

public struct StepSize<T> : INumeric<T>
where T :
    struct, 
    IComparable,
    IComparable<T>,
    IConvertible,
    IEquatable<T>