значение присвоено, никогда не используется, но нет сообщения компилятора - PullRequest
4 голосов
/ 01 февраля 2012

Вся программа в веб-форме веб-приложения .net:

namespace WebApplication1
{
   public partial class WebForm1 : System.Web.UI.Page
   {
     protected void Page_Load(object sender, EventArgs e)
     {
        string x = "";
        string y = String.Empty;
     }
   }
}

Если я создаю приложение, компилятор подчеркивает x,

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

Для y я не получаю подчеркивания.Почему бы и нет?(VS 2008, .Net 3.5)

Ответы [ 3 ]

9 голосов
/ 01 февраля 2012

Я подробно отвечу на ваш вопрос здесь:

https://stackoverflow.com/a/2741281/88656

Вкратце: компилятор обнаруживает, что локальный объект записан, но не прочитан во время прохода анализа потока.Он намеренно подавляет предупреждение, если значение, записанное в local, является непостоянным.String.Empty не является константой, это поле только для чтения, как ни странно.Но пустой строковый литерал является константой.Вот почему вы видите предупреждение для одного с литералом, но не для поля.

Компилятор полагает, что вы можете присвоить значение выражения непрочитанному локальному в порядкедля облегчения отладки программы .Мы не хотим, чтобы вам приходилось отключать «предупреждения - ошибки» каждый раз, когда вы вводите пояснительную переменную, чтобы помочь в отладке.Тот факт, что в этом случае очевидно, что вы не используете переменную для проверки вывода String.Empty, теряется компилятором;он не знает, какова семантика ссылки на поле.

5 голосов
/ 01 февраля 2012

компилятор подчеркивает x,

Нет, компилятор не делает.Редактор подчеркивает.Компилятор не имеет выходного канала, способного рисовать линии.

Для y я не получаю подчеркивания.Почему бы и нет?

Поскольку он используется?

Не поймите меня неправильно, но без полного кода, относящегося к области видимости переменной, просто невозможно сказать, так ли этоили нет.

Вся программа:

Ложь.Это не вся программа;) Это даже не полный класс.И вы не можете иметь переменную в C # вне класса.

0 голосов
/ 01 февраля 2012

Если я правильно понял статью, которую прочитал, компилятор не знает, что такое String.Empty, потому что это поле только для чтения.String.Empty назначается во время выполнения.Поэтому я не получаю предупреждения при сборке программы.

Артикул

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