我希望以下程序打印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++);
}
}
答案 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
得到了++。