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

时间:2010-09-02 18:09:32

标签: c# .net-3.5

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

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

ltlName.Text = name;

我很困惑;肯定这段代码无法编译。但确实如此,它也运行了。 “name + =”行对字符串没有影响(我可以告诉)。这是怎么回事?

(Visual Studio 2008,.NET 3.5)

6 个答案:

答案 0 :(得分:24)

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

name += ltlName.Text = name;

这是一个有效的声明(它将name分配给ltlName.Text,然后将其附加到name。)

答案 1 :(得分:19)

这样做:

name += ltlName.Text = name;

或使其更清晰:

name += (ltlName.Text = name);

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

string tmp = name;
ltlName.Text = tmp;
name += tmp;

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

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
    }
}

简单分配规则(第7.17.1节)用于确定表达式的结果:

  

简单分配的结果   expression是赋给的值   左操作数。结果有了   与左操作数相同的类型是   总是被归类为价值。

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

答案 2 :(得分:5)

在C#中,换行不终止语句 - 只有分号。因此,以下代码行正在执行:

name += ltlName.Text = name;

答案 3 :(得分:1)

因为空格在C#中无关紧要,所以第3,4和5行形成一个语句:

name += ltlName.Text = name;

答案 4 :(得分:1)

正如预期的那样,结果是名称连接到自身。所以你得到“namename”。

obj.Text只是一个属性,因此该行最终转换为

//name += obj.Text = name;
obj.setText(name);
name += obj.Text;

以下的完整资源
public class Program
{
    public static void Main(string[] args)
    {
        MyClass obj = new MyClass();
        string name = "name";
        name += obj.Text = name;
        Console.Write(name); //prints namename
    }
}

答案 5 :(得分:0)

它影响字符串,但直到字符串用于影响显示器上的文字后才会出现。正如KennyTM指出的那样,这两行都形成了一个声明。与VB不同,回车不会在C#中结束语句。分号的确如此。那么这里发生的是字符串被设置为文字,并且该操作的结果(可能是“true”或者只是字符串本身?我不记得了)被附加到字符串。