变量已分配但从未使用过

时间:2010-12-09 12:15:21

标签: c# visual-studio visual-studio-2010 variables

int i, j;
i = j = 1;
VS 2010突出显示

j并发出警告:

  

变量已分配但从未使用过

为什么i被“使用”而j - 不是?


与丹尼尔合作的补充:

int i, j, k, l, m;
i = j = k = l = m = 1;

仅突出显示m

6 个答案:

答案 0 :(得分:5)

我认为这是一个错误,根据Microsoft文档,它应该是相反的顺序, = operator is a right precedent operator 。因此,当我们有i = j = 1时,它应该将其解析为i =(j = 1),在这种情况下,j的值用于初始化i,因此编译器应该说i已启动但从未使用过,不是j

答案 1 :(得分:2)

从技术上讲,ij

都属于这种情况

修改

我再次检查了代码

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");

仅向is发出警告。根据{{​​3}},这是有意的(尽管IMO有一个相当可疑的原因)。

这里真的很神秘就是为什么会有任何警告!

答案 5 :(得分:-1)

我在Visual Studio 2010 Professional上试过这个并且没有得到这样的警告。您使用的VS2010有什么味道?我在工作中使用Professional,在家中使用Express,并且发现Express版本不太准确并带有警告。