2013-05-11 2 views
4

Я озадачен по реакции с CSC на этот код:C# оператора достижимость и определенное назначение

{ 
    int i; 
    if (false) 
    { 
    i++;    // uninitialized, but allowed by compiler 
    } 
    if (false && i < 30) // uninitialized, but allowed by compiler 
    { 
    } 
    if (false && i < 30) // uninitialized, but allowed by compiler 
    { 
    i++;    // NOT ALLOWED by compiler?? 
    } 
} 

В этом коде у меня есть три if с и один неинициализированной локальной переменным я. CSC достаточно умен, чтобы терпеть мое использование i в первом и втором случаях, поскольку он может сказать, что код, в котором я используется, недоступен. Однако в третьем случае он жалуется на прирост «использования неназначенной локальной переменной i». Почему он правильно обнаруживает, что i находится в недостижимом коде в первых двух ifs, но не в третьем (что не что иное, как комбинация первых двух случаев?

+1

Этот вопрос не * действительно * об определенном задании - о достижимости. –

+0

Откуда вы неинициализированы? int - тип значения, поэтому он инициализируется равным нулю. –

+0

@TonyHopkinson i - это локальная переменная, они автоматически не инициализируются для вас! Что касается того, где я могу его получить, это компилятор дал мне эту ошибку! – Mishax

ответ

7

Это объясняется разделом 8.7.1 C# 5 спецификация:.

Первый вложенный оператор из if заявления достижим, если if оператор достижим и булево выражение не имеет постоянное значение false

Даже если мы может рассуждать, что это условие:

false && i < 30 

всегда false, это не постоянное выражение в соответствии с правилами языка (7.19), поэтому первый встроенный оператор в теле достижим.

Это не то, что все, что связано с &&, не является ложным. Это хорошо, например:

if (false && true) 
{ 
    i++; 
} 

... но потому, что выражение i < 30 не является постоянным, ваше исходным выражение не является постоянным. Это так: , хотя мы знаем, что выражение никогда не будет оценено.

язык мог решить, что любое выражение && где LHS имел постоянную экспрессию false также постоянное выражение со значением false, но это не так. (Это будет лишь небольшая добавленная сложность, но уровень полезности действительно маленький.)

Смежные вопросы