我今天正在编写一些代码,当我在另一台显示器上的屏幕上进行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)
这是一个有效的声明(它分配name给ltlName.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,并且值是已分配的值.它是属性而不是字段或局部变量的事实不会改变这一点.
在C#中,换行不终止语句 - 只有分号.所以下面的代码行正在执行:
name += ltlName.Text = name;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
539 次 |
| 最近记录: |