【问题标题】:Can't Overload Operator '+' for object class不能为对象类重载运算符“+”
【发布时间】:2011-06-22 08:57:34
【问题描述】:

我在 c# 中有两个或多个 object 类变量,它们具有整数值。我想重载“+”运算符,这样当我想添加或减去它们时就不必转换这些变量。下面是我的代码:

public static object operator +( object obj1, object obj2)
{
    object o = Convert.toint32(obj1) + Convert.toint32(obj2);
   return o;
}

不,问题是我收到一条错误消息 "One of the parameters of a binary operator must be the containing type"

为什么会这样?任何帮助表示赞赏!

【问题讨论】:

  • 哇 40 秒内有 5 个答案 - 这是 SO 记录吗?
  • 将重载运算符移动到与参数之一相同的类。在您的情况下,整个 Overload 需要在对象类中。

标签: c# asp.net object operator-overloading


【解决方案1】:

编译器错误确切地告诉您出了什么问题 - 如果您要创建自定义二元运算符,则至少一个参数类型(对于操作数)必须与类型您要在其中声明运算符(或它的可为空的版本,对于值类型)。

这是C# 4 specification 的第 10.10.2 节规定的:

以下规则适用于二元运算符声明,其中 T 表示包含运算符声明的类或结构的实例类型:

  • 二元非移位运算符必须采用两个参数,其中至少一个必须具有 T 或 T? 类型,并且可以返回任何类型。
  • 二进制<<>> 运算符必须有两个参数,第一个参数必须为T 或T 类型?而第二个必须是 int 或 int? 类型,并且可以返回任何类型。

如果您知道它们实际上是 int 值,我个人会尽量避免使用 object 类型的变量。为什么不用int 变量呢?

如果您使用 C# 4,另一种选择是将它们设为 dynamic 变量,其中运算符重载将在执行时而不是编译时应用。

【讨论】:

  • 实际上我在这里看到了一个关于添加多个 Object 类型的对象的问题,所以我在想我是否可以覆盖 '+' 运算符,但我不知道这是不可能的,无论如何谢谢你提供了丰富的信息!
【解决方案2】:

您不能覆盖现有类的运算符:只能覆盖您自己的类。

【讨论】:

  • 你不能覆盖操作符——你只能重载它们。
  • 是的,我当然知道。只是检查每个人都醒着;-)
【解决方案3】:

这似乎愚蠢/荒谬,对象是ints,并且因为您不想强制转换,所以通过添加objects(看起来很疯狂)?当你想做myObj + 1 时会发生什么?您需要制作大量的运算符和重载,这不值得。

首先使用正确的类型,以方便将来阅读或维护代码的人。

【讨论】:

    【解决方案4】:

    你是说你想添加两个object类型的对象,你不能这样做。

    正如错误消息所说,运算符方法的两个参数之一必须是您定义运算符的类型。

    即。如果您在名为 XYZ 的类中声明了运算符,则 obj1obj2 必须属于该类型。

    您不能为不相关的类型声明运算符重载。

    基本上,你不能做你想做的事。

    【讨论】:

      【解决方案5】:

      编译器错误准确地告诉你问题所在。

      您不能将运算符重载“注入”到其他人的类型中 - 运算符重载必须应用于您声明它的类型。

      在这种情况下,术语“应用”由编译器错误解释:其中一个参数必须属于该类型;其他参数可以是任意类型。

      所以,例如:

      public class MyType
      {
        public static object operator +(MyType obj1, object obj2){
          //define code for adding the object to 'MyType' and return object,
          //or whatever type you want.
        }
      }
      

      在这个例子中,我们在MyTypeobject 之间创建了一个运算符,它可以工作,因为它是在MyType 中定义的。所有二元运算符重载都必须遵循相同的规则。

      【讨论】:

        【解决方案6】:

        您在一个类中定义运算符,比如说class Foo。编译器告诉你,两个操作数中至少有一个必须是静态类型Foo,例如:

        public static object operator +( Foo obj1, object obj2)
        {
            object o = Convert.toint32(obj1) + Convert.toint32(obj2);
            return o;
        }
        

        目前还不是很清楚您要在这里实现什么。如果你有 class Foo 的对象,但它们的静态类型是 object,那么除非你先将它们转换为 Foo,否则你不能做任何事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          相关资源
          最近更新 更多