Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 命名参数的求值顺序_C#_Named Parameters_Operator Precedence - Fatal编程技术网

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