什么是保证,当执行postfix C#operator ++时?

时间:2016-04-13 02:18:31

标签: c#

我希望以下程序打印method后跟++,但相反的情况发生了;我希望增量运算符,当使用postfix时,在调用Method之后执行,但它实际上是在之前执行的。

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

2 个答案:

答案 0 :(得分:1)

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

举一个更明显的例子:

DateTime.Parse(Console.ReadLine());

我正在做的就是删除Console.ReadLine将返回的临时字符串变量的赋值,然后我将传递给DateTime.Parse。但这仍然是完全有效的语法,因为Console.ReadLine评估为string - DateTime.Parse作为参数的类型。

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

请查看Doc on Expressions以获取更多帮助

答案 1 :(得分:0)

  IL_0009:  ldloc.0
==> put "source" into stack
  IL_000a:  dup
==> duplicate the top of the stack
  IL_000b:  call       valuetype Test Test::op_Increment(valuetype Test)
==> do source ++
  IL_0010:  stloc.0
==> store result of ++ operator to "source"
  IL_0011:  call       void Test::Method(valuetype Test)
==> do Method with original "source" (remember the dup?)

所以根据++ Operator (C# Reference)Method()在++之前按值调用,而source得到了++。