【问题标题】:Constraints, generic variables and arithmetic operators [duplicate]约束、泛型变量和算术运算符
【发布时间】:2010-02-13 02:24:13
【问题描述】:

我想声明一个泛型类 Simple,其中名为 Addition 的方法将采用两个泛型变量并使用 + 将它们相加操作员。我想我可以通过给 Simple 类提供以下约束来实现这一点:

class Simple<T> where T: int
{
    public T Addition(T firstInt, T secondInt)
    {
        return firstInt + secondInt;
    }
}

我怀疑错误与只有以下五种约束类型的泛型有关 - ClassName、class、struct、InterfaceName、new()?因此,为什么泛型也不支持 StructureName 约束类型?这样我们就可以在泛型变量上应用算术运算符?!

感谢

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    StructName 约束没有意义,因为您不能从值类型继承。

    如果你有类似class Simple&lt;T&gt; where T : int 的东西,你可以只用T = int 实例化Simple&lt;T&gt;,没有任何类型继承自int 或任何其他值类型。

    C#(CLR)缺乏其他语言所熟知的type classes,这是一种无需硬编码编译器机制即可处理运算符重载的流行机制(如在 C# 中)。

    【讨论】:

    • 谢谢大家的帮助欢呼:)
    【解决方案2】:

    将 Generic 类型限制为特定结构是没有意义的,因为结构类型不能被继承。这与写作相同:

    class Simple
    {
        public int Addition(int firstInt, int secondInt)
        {
            return firstInt + secondInt;
        }
    }
    

    不幸的是,由于支持IArithmetic interface,因此很难支持具有数学运算的泛型类型。如果您想了解基于泛型的数学运算符的一种方法,请查看Generic Operators in MiscUtil。

    【讨论】:

      【解决方案3】:

      您将T 限制为int。这不是明智之举,因为只有一种 int 类型;所以如果你想int,你可以直接写int。

      如果不限制T,则不能使用+ 运算符,因为对象上没有定义+ 运算符。

      C# 泛型不是 C++ 模板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        相关资源
        最近更新 更多