我在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"
为什么会这样?任何帮助表示赞赏!
答案 0 :(得分:7)
编译器错误告诉你完全什么是错误的 - 如果你要创建一个自定义二元运算符,至少有一个参数类型(对于操作数)必须与键入你声明操作符(或者它的可空版本,用于值类型)。
的第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的类中声明了运算符,则obj1
或obj2
必须属于该类型。
您无法为不相关的类型声明运算符重载。
基本上,你不能做你想做的事。
答案 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.
}
}
在此示例中,我们在MyType
和object
之间创建了一个运算符,它的工作原理是因为它是在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
,否则您无法执行任何操作。