【问题标题】:Support of + operator in a generic class in C# [duplicate]在 C# 的泛型类中支持 + 运算符 [重复]
【发布时间】:2016-12-30 05:24:57
【问题描述】:

我是 C# 的新手。我需要创建一个通用类。还应该有一个约束:“客户端可以通过 Int 或 Float 类实现”。 包含将返回总计的“totalNums”方法。

通用类

public class clsPrint<T>
{      

    public T totalNums(T num1, T num2)
    {
        T Total = num1 + num2;
        return Total;
    }        

}

“Num1 + Num2”上的编译时错误:运算符“+”不能应用于“T”和“T”类型的操作数

为什么我会收到此错误以及解决方案是什么?

【问题讨论】:

  • 写泛型的时候,T在你写代码的时候基本就当成object了。因此,object + object 没有任何语法意义。
  • 那么,有没有其他方法可以实现呢? @Abion47
  • 严格来说,有一种使用反射和抽象的方法(参见我的重复评论),但它非常难看。一般来说,我建议不要为此使用泛型,而是使用两种不同的方法重载:一种采用int 参数,另一种采用float 参数。
  • 谢谢。实际上,我想练习通用课程。于是想到了这个想法。
  • 一开始就不要这样做。如果它只能用 int 和 float 实例化,那么它不是 generic。只需创建两个类,一个用于 int 操作,一个用于 float 操作。

标签: c# .net generics


【解决方案1】:

因为T 的类型在实例化之前是未知的,所以不能保证T 类型将支持+ 运算符。

有一个使用dynamic 运算符的解决方法:(注意:如果您不传递+ 支持的操作数,那么它将引发运行时错误。)

public T totalNums(T num1, T num1)
        {
            dynamic dx = num1, dy = num1;
            return dx + dy;
        }

【讨论】:

  • 那么,有没有其他方法可以实现呢?
  • 很好。我可以添加 Int、Float 或 string 类作为约束类吗?示例:公共类 clsPrint where T : String
  • @Mohit intfloatstring 是密封类。您不能将密封类用作通用约束。
  • 谢谢@Abion47。
  • @Abion47: intfloatstring 是关键字。 int 表示System.Int32float 表示System.Single 两者都是structs。结构是 value typesvalue types 是密封的。同样string 表示密封类System.String
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2015-05-23
  • 2010-10-19
  • 2011-05-27
  • 2011-05-01
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多