繁体   English   中英

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

[英]Can't Overload Operator '+' for object class

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

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

编译器错误告诉您究竟出了什么问题 - 如果您要创建自定义二进制运算符,则至少有一个参数类型(对于操作数)必须与您声明运算符的类型相同(或者它的可空版本,用于值类型)。

这是C#4规范第10.10.2节中规定的

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

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

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

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

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

这看起来很愚蠢/荒谬 ,对象是int ,并且因为你不想强制转换,你会通过添加object (这看起来很疯狂)来降低你的代码的可读性? 当你想做myObj + 1时会发生什么? 你需要制作大量的操作符和重载,这是不值得的。

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

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

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

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

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

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

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

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

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

所以,例如:

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

你是在一个类中定义运算符,让我们说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 ,否则你不能做任何事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM