C# 命名参数的求值顺序
可能重复:C# 命名参数的求值顺序,c#,named-parameters,operator-precedence,C#,Named Parameters,Operator Precedence,可能重复: 说我有 void foo(int x,int y) 并称之为: foo(y:genNum(),x:genNum()) 在这种情况下,C#是否保证x和y的求值顺序?根据,参数总是从左到右求值。不幸的是,在C#4.0的某些角落案例中存在一些bug。有关更多详细信息,请参阅Eric Lippert的帖子 顺便说一句,这可能是一种不好的做法。如果要保证参数的求值顺序,请先在局部变量中捕获结果,然后将结果传递给使用方法,如: int capturedY = genNum(); //It is
说我有
void foo(int x,int y)
并称之为:
foo(y:genNum(),x:genNum())
在这种情况下,C#是否保证x和y的求值顺序?根据,参数总是从左到右求值。不幸的是,在C#4.0的某些角落案例中存在一些bug。有关更多详细信息,请参阅Eric Lippert的帖子
顺便说一句,这可能是一种不好的做法。如果要保证参数的求值顺序,请先在局部变量中捕获结果,然后将结果传递给使用方法,如:
int capturedY = genNum(); //It is important that Y is generated before X!
int capturedX = genNum();
foo(capturedX, capturedY);
我想不出一个好的理由不这样做。这不是一个答案,只是为了说明副作用
输出:
2
1
根据报告:
…第二个调用颠倒了参数的顺序,但是
结果仍然是一样的,因为参数是匹配的
按名称而不是位置使用参数
在您的情况下,第一个将执行y
,并在x
之后执行,因为它出现在函数声明中的第一个位置(从左侧)
事实上,它最终就像第二个参数一样,是实现命名参数的C#编译器的一个实现细节。有趣的理论问题,但在实践中用这种方式编写代码是一个可怕的想法。如果您这样做,请为将来必须维护代码的用户提供指向此问题的链接。该问题应关闭,因为正如某些答案中所指出的,它是多个问题的重复。可能不是重复的。我的问题特别涉及命名参数传递的求值顺序。(链接的问题显然没有解决我的问题。)“结果仍然是一样的”只有在调用genNum没有副作用的情况下才是正确的。@PeteBaughman:Skeet,不知道OP编写的代码,这是非常危险的,而且没有效率。
2
1