int i, j;
i = j = 1;
VS 2010突出显示 j
并发出警告:
变量已分配但从未使用过
为什么i
被“使用”而j
- 不是?
与丹尼尔合作的补充:
int i, j, k, l, m;
i = j = k = l = m = 1;
仅突出显示m
。
答案 0 :(得分:5)
我认为这是一个错误,根据Microsoft文档,它应该是相反的顺序, =
operator is a right precedent operator 。因此,当我们有i = j = 1时,它应该将其解析为i =(j = 1),在这种情况下,j
的值用于初始化i
,因此编译器应该说i
已启动但从未使用过,不是j
。
答案 1 :(得分:2)
从技术上讲,i
和j
修改强>
我再次检查了代码
int ii, jj;
ii = jj = 1;
使用Reflector生成IL我发现
.maxstack 2
.locals init (
[0] int32 ii,
[1] int32 jj)
L_0000: nop
L_0001: ldc.i4.1 //pushes the integer value of 1 onto the evaluation stack
L_0002: dup //copies the current topmost value on the evaluation stack, and then pushes the copy
L_0003: stloc.1
L_0004: stloc.0
L_0005: ret
由此,它似乎将1分配给ii,然后ii 复制到jj。
答案 2 :(得分:1)
这是Visual Studio C#编译器的限制。我们无法回答,因为我们还没有实施。
原始回答
i
可能稍后会在您的函数中使用,而j
则不会。
要删除“可能”,您应该发布整个功能。 (更新:这不是真的。主要内部的整个代码是OP发布的内容。)
答案 3 :(得分:1)
我已经使用Resharper进行了尝试,并且它足够聪明,可以正确地为所有变量发出警告。
答案 4 :(得分:1)
实际上,i
的意图是不要将其突出显示为警告,因为它是根据变量的值初始化的。仅当从编译时常量分配变量时才会发出此警告。
尝试以下代码:
int i = 0;
string s = "string";
string t = "another string";
string u = t;
var v = new string('v', 1);
var y = new XElement("hello");
仅向i
和s
发出警告。根据{{3}},这是有意的(尽管IMO有一个相当可疑的原因)。
这里真的很神秘就是为什么会有任何警告!
答案 5 :(得分:-1)
我在Visual Studio 2010 Professional上试过这个并且没有得到这样的警告。您使用的VS2010有什么味道?我在工作中使用Professional,在家中使用Express,并且发现Express版本不太准确并带有警告。