VisualStudio2008 странное предупреждение компилятора, требуется пояснение - PullRequest
4 голосов
/ 10 января 2011

Просто быстрый вопрос к компилятору VisualStudio 2008.

Мы включили, чтобы предупреждения компилятора обрабатывались как ошибки, которые прекрасно работают, но сегодня я понял, что следующее поведение:

static void Main(string[] args)
{
    int number = 0;
    DateTime dateTime = DateTime.Now;
}

Компиляция этого фрагмента приводит только к одному предупреждению: «Переменная 'number' назначена, но ее значение никогда не используется".

Может кто-нибудь объяснить мне разницу, почему номер переменной приводит к ошибке, а не переменная dateTime?

Хорошо, похоже, это связано с литералами. Принимая во внимание следующий код:

static void Main(string[] args)
{
    string str1 = "Foo";
    string str2 = str1;
}

Компиляция с обеими строками не приводит к предупреждению, хотя на переменную "str2" никогда не ссылаются. Если вы закомментируете строку string str2 = str1;, появится предупреждение, что переменная "str1" никогда не используется.

Ответы [ 4 ]

5 голосов
/ 10 января 2011

Это потому, что DateTime.Now - это свойство, а не литерал. Получатели свойств могут иметь побочные эффекты, просто вызов одного из них может быть полезным сам по себе. Не то, чтобы это была хорошая идея, однако это не verboten , чтобы сделать это, и компилятор не достаточно умен, чтобы сказать, делает ли это. В любом случае это невозможно, в конечном итоге он вызывает код операционной системы для получения текущего системного времени.

3 голосов
/ 10 января 2011

Я предполагаю, что утверждение int number = 0; совершенно не имеет побочных эффектов и может быть определено компилятором как лишнее. DateTime dateTime = DateTime.Now;, с другой стороны, является оценкой статического свойства и потенциально может выполнять другой код, поэтому компилятор не идентифицирует его как неиспользуемую переменную. Другими словами, хотя переменная может быть неиспользованной, ее присвоение может потенциально сделать что-то еще.

2 голосов
/ 11 января 2011

Эрик Липперт написал статью об этом, так что я оставлю ему объяснение:

Обычно C # предупреждает обо всех переменных и поля, которые никогда не читаются, никогда написано и т. д. Но в этом случае мы намеренно подавить предупреждение, если назначение не является константой выражение.

Это потому что нет хорошего пути в отладчике Visual Studio, чтобы сказать «покажи мне возвращаемое значение последнего вызов функции ". Хотя я бы согласился если бы вы разумно указать, что способ решить это исправить отладчик, учитывая, что у меня нет возможности чтобы исправить это, нам нужно решение в C # для наших клиентов.

См. Статью для дальнейшего объяснения.

0 голосов
/ 10 января 2011

DateTime.Now является ссылкой. Я могу ошибаться, поскольку у меня нет опыта работы с C #, но я не думаю, что вы создаете новый объект при использовании DateTime.Now.

...