无法为对象类重载运算符'+'

时间:2011-06-22 08:57:35

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

我在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"

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

6 个答案:

答案 0 :(得分:7)

编译器错误告诉你完全什么是错误的 - 如果你要创建一个自定义二元运算符,至少有一个参数类型(对于操作数)必须与键入你声明操作符(或者它的可空版本,用于值类型)。

这是C# 4 specification

的第10.10.2节规定的
  

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

这似乎是愚蠢/荒谬,对象是int,并且因为您不想强制转换,所以添加{{1}会降低您的代码的可读性s(看起来很疯狂)?如果您想object,会发生什么?你需要制作大量的操作符和重载,这是不值得的。

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

答案 3 :(得分:2)

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

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

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

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

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

答案 4 :(得分:2)

编译器错误告诉您确切的问题。

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

这种情况下的术语“应用”然后由编译器错误解释:其中一个参数必须是该类型;另一个参数可以是任何类型。

所以,例如:

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内定义的。所有二元运算符重载必须遵循相同的规则。

答案 5 :(得分:1)

您正在定义类中的运算符,假设为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,否则您无法执行任何操作。