当后缀C#运算符++;被处决了?

当后缀C#运算符++;被处决了?,c#,C#,我希望下面的程序先打印方法,然后打印++,但结果正好相反;当使用后缀时,我希望增量操作符在调用方法之后执行,但实际上它是在调用之前执行的 using static System.Console; struct Test { public static Test operator ++(Test source) { WriteLine("++"); return source; } static void Method(Test val

我希望下面的程序先打印
方法
,然后打印
++
,但结果正好相反;当使用后缀时,我希望增量操作符在调用方法之后执行,但实际上它是在调用之前执行的

using static System.Console;

struct Test {

    public static Test operator ++(Test source) {
        WriteLine("++");
        return source;
    }

    static void Method(Test value) => WriteLine("Method");

    static void Main(string[] args) {
        var test = new Test();
        Method(test++);
    }
}

因此,根据++之前的值调用的,
Method()
,而
source
got++。

它肯定不是一个bug。当您开始将多个表达式嵌套在一起时,它们仍将按逻辑顺序执行

举一个更明显的例子:

DateTime.Parse(Console.ReadLine());
我所做的就是删除一个临时字符串变量的赋值,该变量
Console.ReadLine
将返回,我将传递到
DateTime.Parse
。但这仍然是完全有效的语法,因为
Console.ReadLine
的计算结果是
string
DateTime.Parse
作为参数使用的类型

这里没有魔法。编译器知道必须完全实现内部表达式才能计算外部表达式


查看以获取更多帮助

当然,首先要评估
++
。表达式在作为参数传递之前进行求值——后缀或前缀无关紧要,因为它基本上是一个完全不同的级别。方法的所有参数都在调用该方法之前进行求值。前缀和后缀只是决定它是否传递增量之前或之后的值。Bryce等人,谢谢!可以公平地说,后缀增量运算是唯一的,因为它是唯一一个逻辑上总是不同的运算,直到对它的封闭表达式求值之后才影响封闭表达式的结果吗?不。。我想这也不是真的。我敢打赌你的权利,这不是一个错误,但我仍然不清楚为什么。以Outter(x++)为例。在对内部表达式的结果(增量)求值之前,使用值x对外部表达式(方法调用)求值。因此,内部表达式的结果并不总是传递给外部表达式。既然在计算outter表达式之前增量的结果不在范围内,为什么不在方法调用之后将增量的计算定义为?为什么要计算一个还不需要其值的表达式?谢谢。是的,文档说
运算的结果是操作数递增之前的值。
这很有意义。
DateTime.Parse(Console.ReadLine());