Код: Выделить всё
MyClass instance;
try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}
instance.doStuff(); // Use of unassigned local variable 'instance'
А что, если я не хочу, чтобы тест провалился, а был помечен как неубедительный? Я мог бы выполнить Assert.Inconclusive вместо Fail, и было бы неплохо, если бы компилятор знал, что после этого выполнение не продолжится.
Так является ли это случаем знания времени выполнения и времени компиляции о том, где будет разрешено продолжить выполнение? Будет ли когда-нибудь разумно для C# иметь какой-то способ сказать, что член, в данном случае Assert.Fail, никогда не разрешит выполнение после своего возврата? Возможно, это могло бы быть в форме атрибута метода. Будет ли это полезно или будет ненужной сложностью для компилятора?
Вне модульных тестов
Поскольку люди [обоснованно] отмечают, что это глупый способ написания модульного теста, рассмотрите мой вопрос за пределами области модульного тестирования:
Код: Выделить всё
MyClass instance;
if (badThings)
{
someMethodThatWillNeverReturn();
}
else
{
instance = new MyClass();
}
instance.doStuff();
Resharper знает
Если я добавлю возврат после Assert.Fail или Assert.Inconclusive цвета Resharper возвращаются серыми и имеют всплывающую подсказку с надписью «Код эвристически недостижим».
Подробнее здесь: https://stackoverflow.com/questions/251 ... er-returns
Мобильная версия