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);
        }            
    }