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

4

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

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

问题是我收到一个错误提示,显示"二元运算符的参数之一必须是包含类型"

为什么会出现这个问题?需要帮助!


3
40秒内回答5个问题,这是Stack Overflow的记录吗? - Andras Zoltan
1
将重载运算符移动到与其中一个参数相同的类中。在您的情况下,整个重载需要在对象类中。 - Maverick Meerkat
6个回答

9
编译器错误会准确地告诉你出了什么问题 - 如果你要创建一个自定义的二元运算符,至少一个参数类型(用于操作数)必须与你声明运算符的类型相同(或者对于值类型,是可空版本)。
这在C# 4 specification的10.10.2节中规定:
  • 二元非移位运算符必须有两个参数,其中至少一个参数的类型必须为T或T?,可以返回任何类型。
  • 二元<<>> 运算符必须有两个参数,其中第一个参数必须为T或T?类型,第二个参数必须为int或int?类型,可以返回任何类型。
个人建议尽量避免使用类型为object的变量,如果你知道它们实际上是int值,为什么不使用int变量呢?
如果您使用的是C# 4,则另一种选择是将它们设置为dynamic变量,在执行时而不是编译时应用运算符重载。

其实我在这里看到一个关于添加多个类型为“Object”的对象的问题,所以我在想是否可以重载'+'运算符,但我不知道它是不可能的。不管怎样,谢谢你提供的信息! - love Computer science

4

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


3
你无法完全覆盖运算符 - 你只能重载它们。 - Jon Skeet
1
是的,我知道,当然。只是想确认大家都还清醒呢 ;-) - Tim Rogers

3
这似乎很荒谬,对象是整数,因为你不想进行强制转换,所以你会添加对象(这看起来很疯狂),这样会使你的代码变得不太易读。 如果你想要执行myObj + 1会发生什么? 你需要创建一个大量的运算符和重载数组,这样做并不值得。为了那些将来需要阅读或维护代码的人,请一开始就使用正确类型。

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

2

您想要将两个类型为 object 的对象相加,但是这是不允许的。

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

也就是说,如果您在名为 XYZ 的类中声明了运算符,则 obj1obj2 必须是该类型之一。

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

基本上,您不能做您想要做的事情。


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,否则你无法做任何事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接