为什么"someString + = AnotherString = someString;" 在C#中有效

Ed *_*ehm 16 c# .net-3.5

我今天正在编写一些代码,当我在另一台显示器上的屏幕上进行alt-tabbed以检查某些内容时处于中间位置.当我回头看时,ReSharper将灰色下面的第3行着色,并注明"分配的值未在任何执行路径中使用".

var ltlName = (Literal) e.Item.FindControl("ltlName");
string name = item.FirstName;
name += 

ltlName.Text = name;
Run Code Online (Sandbox Code Playgroud)

我很困惑; 肯定这段代码无法编译.但确实如此,它也运行了."name + ="行对字符串没有影响(我可以告诉).这里发生了什么?

(Visual Studio 2008,.NET 3.5)

ken*_*ytm 24

请注意,换行符在C#中并不特殊.由于以下行,编译器的完整语句是

name += ltlName.Text = name;
Run Code Online (Sandbox Code Playgroud)

这是一个有效的声明(它分配nameltlName.Text,然后附加到name.)


Jon*_*eet 19

这样做:

name += ltlName.Text = name;
Run Code Online (Sandbox Code Playgroud)

或者使它更清晰:

name += (ltlName.Text = name);
Run Code Online (Sandbox Code Playgroud)

属性setter的结果是设置的值,所以它有点像这样:

string tmp = name;
ltlName.Text = tmp;
name += tmp;
Run Code Online (Sandbox Code Playgroud)

当你涉及到不同的变量时,更容易观察到这一点,并且只是简单的赋值作为最后一步而不是复合赋值.这是一个完整的例子:

using System;

class Test
{
    public string Text { get; set; }

    static void Main()
    {
        Test t = new Test();

        string x = t.Text = "Hello";
        Console.WriteLine(x); // Prints Hello
    }
}
Run Code Online (Sandbox Code Playgroud)

简单赋值规则(第7.17.1)被用来确定该表达式的结果:

简单赋值表达式的结果是赋给左操作数的值.结果与左操作数的类型相同,并且始终归类为值.

因此类型ltlName.Text = name与类型相同ltlName.Text,并且值是已分配的值.它是属性而不是字段或局部变量的事实不会改变这一点.

  • 或许值得注意的是,在这样的一个表达式中执行多个赋值的代码很难阅读,通常应该避免.(事实上​​它很容易引起关于它的问题,这就是证据!) (3认同)

fro*_*die 5

在C#中,换行不终止语句 - 只有分号.所以下面的代码行正在执行:

name += ltlName.Text = name;
Run Code Online (Sandbox Code Playgroud)