29

I stumbled across this while starting to learn about vars here:

http://msdn.microsoft.com/en-us/library/bb384061.aspx

However, I have no idea how that is a legal expression (it is). I thought you couldn't assign to something using an a = (b=c) because (b=c) does not produce a value to assign?

Thanks for any clarification on the matter.

4

10 回答 10

31

这是合法的。从= 运算符 C# 参考页

赋值运算符 (=) 将其右侧操作数的值存储在由其左侧操作数表示的存储位置、属性或索引器中,并将该值作为结果返回。

(强调我的)

示例中的代码是人为设计的(并且毫无意义),但它可以在其他情况下以更简洁的方式完成有用的事情。例如:

BinaryTree tree;
TreeNode node;
if((node = tree.FindNodeForKey(10)) != null)
{
    // do useful things with returned node
}
于 2012-05-16T00:33:21.220 回答
14

来自 MSDN 的整个报价是:

使用 var 声明的变量不能在初始化表达式中使用。换句话说,这个表达式是合法的: int i = (i = 20); 但是这个表达式会产生编译时错误: var i = (i = 20);

关键是你不能在初始化表达式中使用由 var 声明的变量。换句话说,如果你使用 var 来声明 i,那么你不能在 = 符号的另一边使用 i。

正如其他人所指出的,您实际上不会编写此代码。这是一个人为的例子。

于 2012-05-16T00:35:37.933 回答
6

我一直用那种东西。

public class Parameters
{
    public readonly bool ContainsSquareBrackets;

    public Parameters(string paras)
    {
        if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('['))
        {
             // do something ...
        }
    }
}
于 2012-05-16T00:33:10.253 回答
4

这个特定的代码是没有意义的。赋值表达式返回刚刚赋值的值。因此,结果:

i = 20

是,当然,20。因此:

i = (i = 20);

是相同的:

i = 20;

有时,赋值返回某些东西的事实可能很有用,例如在 for 循环中:

for (string line; (line = reader.ReadLine()) != null;) { ... }

(对于它的价值,我不会在这种特殊情况下使用这个成语)

或者将相同的值分配给多个变量:

int x, y;
x = y = 5;

现在,两者都x具有y价值5

于 2012-05-16T00:32:18.047 回答
3

It is legal in C# because the order of evaluation for operators is left to right by default,unlike C/C++ languages that don't define a limit in sequence point.. The = operator assign the value to 20 and returns the value as result. It's parsed as:

int i; //<- i is declared. 
i = 20; // assign 20 to i variable and returns.
i = i; // assign i as i value of.

It's an ambiguous expression

于 2012-05-16T00:49:12.683 回答
2

该代码是非线程安全的方式来将字面值 20 分配给局部变量 i。

该表达式i = 20具有将 20 分配给 的副作用i,并且在分配之后具有 的值i。表达式i = (i = 20)为 i 分配 的值(i = 20),这几乎总是i外部分配时的值。如果线程被中断,表达式 (i = 20) 仍将具有值 20,尽管 i 在外部赋值发生时可能具有不同的值。

在任何情况下,您都不想编写这个确切的代码。

于 2012-05-16T00:31:41.740 回答
1

虽然它的含义与 相同i = 20,但在某些情况下它可能具有有用的目的。

如果其他人将维护您的代码,并看到如下内容:

if ( i = some_function() )

他们可能认为这是一个错误并===. 为了表明这是您打算做的,您可以使用

if ( i = (i = some_function()) )

不过,我个人觉得if ( i = /* = */ some_function() )还是i = some_function(); if (i)为了更干净。

于 2012-05-16T03:05:51.400 回答
0

赋值运算符返回分配的值。

因此,

i = 20

返回 20

它被分配给 i。

所以,

i = (i = 20);

一样好

i = 20;
于 2012-05-22T08:32:47.763 回答
0

关于如何声明变量,您可以采用相同的方法。它只是您阅读的那个使阅读变得复杂。

它的存在是因为它可以用来混淆代码,在我看来它的存在与安全性有很深的联系。

于 2012-05-16T01:57:25.190 回答
0

甚至以下在 C++ 和 C# 中也是有效的:

整数 i = i = i = 20;

上面的语句是赋值运算符从右到左操作数分配阀门的简单用法。

于 2012-05-16T00:54:15.443 回答