Переменная присваивается, но никогда не используется - PullRequest
7 голосов
/ 09 декабря 2010
int i, j;
i = j = 1;

j подсвечивается VS 2010 с предупреждением:

Переменная присваивается, но никогда не используется

Почему i «используется»а j - нет?

Дополнение в сотрудничестве с Даниилом:

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

Только m выделено.

Ответы [ 6 ]

5 голосов
/ 09 декабря 2010

Я думаю, что это ошибка, она должна быть в обратном порядке, = оператор является прецедентным оператором в соответствии с документацией Microsoft. Поэтому, когда у нас i = j = 1, он должен анализировать его как i = (j = 1), в этом случае значение j используется для инициализации i, поэтому компилятор должен сказать, что i инициирован, но никогда не используется, а не j.

2 голосов
/ 09 декабря 2010

Технически это должно иметь место как для 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.

1 голос
/ 06 октября 2011

На самом деле предполагается, что поведение 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 - предупреждения,Согласно этому посту , это предназначено (хотя по весьма сомнительной причине ИМО).

Так что на самом деле загадка здесь в том, почему вообще есть какие-либо предупреждения!

1 голос
/ 09 декабря 2010

Я пробовал это с Resharper, и он достаточно умен, чтобы правильно выдавать предупреждения для всех переменных.

1 голос
/ 09 декабря 2010

Это ограничение компилятора Visual Studio C #.Мы не можем ответить, потому что мы не реализовали его.


Исходный ответ

i, вероятно, используется позже в вашей функции, тогда как j not.

Чтобы удалить «вероятно», вы должны опубликовать всю функцию.( Обновление: Это не так. Весь код внутри main - это то, что опубликовал OP.)

0 голосов
/ 09 декабря 2010

Я пробовал это в Visual Studio 2010 Professional и не получил такого предупреждения. Какой вкус VS2010 вы используете? Я использую Professional на работе и Express дома, и считаю версию Express менее точной с предупреждениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...