[英]overload == (and != , of course) operator, can I bypass == to determine whether the object is null
[英]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"
为什么会这样? 任何帮助表示赞赏!
编译器错误告诉您究竟出了什么问题 - 如果您要创建自定义二进制运算符,则至少有一个参数类型(对于操作数)必须与您声明运算符的类型相同(或者它的可空版本,用于值类型)。
以下规则适用于二元运算符声明,其中T表示包含运算符声明的类或结构的实例类型:
- 二元非移位运算符必须采用两个参数,其中至少有一个必须具有类型T或T?,并且可以返回任何类型。
- 二进制
<<
或>>
运算符必须带两个参数,第一个参数必须是T或T? 第二个必须有int或int?类型,并且可以返回任何类型。
就个人而言,如果你知道它们实际上是int
值,我会尽量避免使用object
类型的变量。 为什么不使用int
变量呢?
如果您正在使用C#4,另一种方法是使它们成为dynamic
变量,其中运算符重载将在执行时而不是编译时应用。
您不能覆盖现有类的运算符:只有您自己的类。
这看起来很愚蠢/荒谬 ,对象是int
,并且因为你不想强制转换,你会通过添加object
(这看起来很疯狂)来降低你的代码的可读性? 当你想做myObj + 1
时会发生什么? 你需要制作大量的操作符和重载,这是不值得的。
首先使用正确的类型,以便将来必须阅读或维护代码的人。
你说要添加两个object类型的object
,你不能这样做。
正如错误消息所示,operator方法的两个参数之一必须是您定义运算符的类型。
即。 如果您在名为XYZ的类中声明了运算符,则obj1
或obj2
必须属于该类型。
您不能为不相关的类型声明运算符重载。
基本上,你不能做你想做的事。
编译器错误正在告诉您确切的问题。
您不能将操作符重载“注入”其他人的类型 - 操作符重载必须应用于您声明它的类型。
在这种情况下,术语“应用”然后由编译器错误解释:其中一个参数必须是该类型; 另一个参数可以是任何类型。
所以,例如:
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
定义的。 所有二元运算符重载必须遵循相同的规则。
你是在一个类中定义运算符,让我们说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.