为什么编译? - > int foo = foo = 5;

时间:2014-02-26 12:13:25

标签: c#

为什么这行编译?

int foo = foo = 5;

我在一个我正在维护的系统中发现了这个,并且无法理解它的用途。

7 个答案:

答案 0 :(得分:5)

没有目的。它相当于:

int foo = 5;

答案 1 :(得分:2)

来自= Operator (C# Reference)

  

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

您的代码就像右手foo = 5;一样有效,它会将5作为值int foo返回5

这就是为什么

int foo = foo = 5;

等于

int foo = (foo = 5);

也等于

int foo = 5;

答案 2 :(得分:2)

好吧,首先声明整数值:

int foo

然后你分配

int foo = 

分配foo的值是

foo = 5

因为foo是先前声明的 返回结果(5)所以它很好;

最后:

  1. 声明了本地变量int foo
  2. 已分配到int foo =
  3. 表达式int foo = foo = 5;
  4. 表达式将5设置为foo并返回5

答案 3 :(得分:0)

编译和有目的是两件事。

它会编译,因为foo = 5会返回5,可以将其分配给foo。这没有用处,因为foo已设置为5

很可能是重构的结果。

答案 4 :(得分:0)

它说foo等于5而foo等于foo

导致foo为5。

在这种情况下,根本没用。

但是请说:

int foo;
int bar;

foo = bar = 5;

将导致foo和bar都等于5。

我不是说它好或有目的,但它有效

答案 5 :(得分:0)

你的代码说它将相同的变量设置为相同的值,所以没有任何意图,但是这个编译是因为C#允许你以一种方式在一行中为多个变量设置相同的值。一个让它更容易理解的例子:

var foo = 3;
var bar = 1;
foo = bar = 5;
Console.WriteLine("foo: {0}, bar: {1}", foo, bar); // Output: foo: 5, bar: 5
Console.ReadKey();

答案 6 :(得分:0)

为什么要编译?因为没有人在编译器中添加了一个可以防止这种怪异的功能;与其他可以添加的功能相比,它的优先级可能太低了。

关于"它做了什么?",就像其他人所说的那样,=运算符返回其右操作数,这在某些情况下很有用,例如: while( (line = ReadLine()) != null )。因此,它将foo设置为5,然后再次将foo设置为5 ....