Как подавить предупреждение C # CS0675: побитовый оператор или оператор, используемый в операнде с расширенным знаком - PullRequest
6 голосов
/ 30 октября 2010

Я не могу избавиться от этого предупреждения для следующей строки кода:

d.word[wrdIndex++] = d.GetWord(english) | (ulong)i;

предупреждение применяется к коду после оператора присваивания.метод GetWord возвращает ulong.Я пробовал следующее безрезультатно:

d.word[wrdIndex++] = (d.GetWord(english) | (ulong)i);
d.word[wrdIndex++] = d.GetWord(english) | ((ulong)i);
d.word[wrdIndex++] = ((ulong)d.GetWord(english)) | ((ulong)i);

У кого-нибудь есть идеи?

Ответы [ 3 ]

17 голосов
/ 30 октября 2010

ОБНОВЛЕНИЕ : Этот вопрос был темой моего блога в понедельник 29 ноября 2010 года:

http://blogs.msdn.com/b/ericlippert/archive/2010/11/29/bit-twiddling-what-does-warning-cs0675-mean.aspx

Спасибо за отличный вопрос!


Вы избавляетесь от предупреждения, сначала подумав о предупреждении и решив, прав ли компилятор, чтобы в первую очередь обратить ваше внимание на проблему! Собственно ли вы собираетесь получать неправильные результаты от побитового типа или преобразование из типа со знаком в тип без знака увеличит целое число?

Если ответ да тогда ваше решение неверно.Не устраняйте предупреждение, заставляя компилятор по-прежнему делать неправильные вещи без предупреждения.Устраните предупреждение, сделав правильную вещь: не используйте преобразование, которое расширяет целое число.

Если ответ нет , а вы хотите расширение знака, то ваше решение или решение Ханса Пассанта является правильным.Тем не менее, я бы добавил комментарий к этому эффекту в коде, потому что в его нынешнем виде трудно понять, что расширение знака желательно.

6 голосов
/ 30 октября 2010
int i=-1;                 // =         0xFFFFFFFF
ulong u1=(ulong)i;        // = 0xFFFFFFFFFFFFFFFF
ulong u1a=(ulong)(long)i; // = 0xFFFFFFFFFFFFFFFF
ulong u2=(ulong)(uint)i;  // = 0x00000000FFFFFFFF

Таким образом, приведение от int к ulong соответствует сначала продолжению знака до (подписи) long, а затем выбрасыванию знака.

2 голосов
/ 30 октября 2010

Извините, просто избавился от этого так:

ulong w = d.GetWord(english);
ulong u = (ulong)i;
d.word[wrdIndex++] = w | u;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...