C# 为什么在c语言中必须使用运算符重载#
我不明白为什么下面的代码会抛出错误C# 为什么在c语言中必须使用运算符重载#,c#,C#,我不明白为什么下面的代码会抛出错误 class MyNumber { public int Number { get; set; } } 目前没有为MyNumber定义的+运算符。这意味着您在尝试使用MyNumber时会出现语法错误,而您可能需要类似以下内容: class Program { public static void Main() { MyNumber firstNumber = new MyNumber(); MyNumbe
class MyNumber
{
public int Number { get; set; }
}
目前没有为MyNumber定义的
+
运算符。这意味着您在尝试使用MyNumber时会出现语法错误,而您可能需要类似以下内容:
class Program
{
public static void Main()
{
MyNumber firstNumber = new MyNumber();
MyNumber secondNumber = new MyNumber();
firstNumber.Number = 10;
secondNumber.Number = 5;
MyNumber sum = firstNumber + secondNumber;
}
}
这说明了在MyNumber类的上下文中,
+
意味着什么这些加法运算符根据所针对的类型产生不同的结果
class MyNumber
{
public int Number { get; set; }
public static MyNumber operator +(MyNumber c1, MyNumber c2)
{
//sum the .Number components and return them as a new MyNumber
return new MyNumber{ Number = c1.Number + c2.Number };
}
}
现在,对于自定义类,如果您不告诉它该做什么,您希望运算符如何工作?答案非常简单,编译器不知道如何为自定义类型处理这些操作。
您引用的示例很简单,您希望,当我说add
+
时,然后添加具有相同名称的属性,但让我们以您已经学习过的基本复数类的另一个示例乘法*
,我们知道复数类的乘法是
(a+ib)*(c+id)=ac-bd+i(bc+ad)
你们认为编译器有一个魔术,他知道这是复数类,乘法是这样进行的,当然它不知道,因为你们需要这样告诉它,你们必须执行运算,这就是为什么需要运算符重载的原因。当然,如果不重载,则会在错误列表中出现异常
错误1运算符“+”不能应用于“ConsoleApplicationTest.Class1”和“ConsoleApplicationTest.Class1”类型的操作数
所以对于复杂类的实现是这样的
string s = "Foo" + "Bar"; //Resulting in FooBar
int i = 1 + 3; //Resulting in 4
因为编译器不知道如何处理自定义类型上的
+
操作,除非您指定该操作,否则将实现运算符。完全正确!最初的问题是,“我为什么要为我的程序编程?”
public class Complex
{
public int real;
public int imaginary;
public Complex(int real, int imaginary)
{
this.real = real;
this.imaginary = imaginary;
}
public static Complex operator *(Complex c1, Complex c2)
{
return new Complex(c1.real * c2.real - c1.imaginary * c2.imaginary, c1.imaginary * c2.real + c1.real * c2.imaginary);
}
}