У меня есть немного кода со следующей логикой:
//pseudo-code
foreach (element in elementList) {
if (element is whatever)
return element;
}
}
В теории всегда существует один элемент, который является тем, что, таким образом, этот метод не должен создавать проблемы. В любом случае я поместил утверждение на конец метода только, чтобы быть уверенным:
//pseudo-code
foreach (element in elementList) {
if (element is whatever)
return element;
}
}
Contract.Assert(false, "Invalid state!");
Проблема состоит в том, что, поскольку этот метод должен возвратить что-то, и компилятор не понимает, что утверждение повредит выполнение программы. Перед использованием Контрактов, в подобных ситуациях, я раньше выдавал Исключение, которое решило проблему. Как Вы обработали бы это с Контрактом. Утверждать ()? Возврат пустого указателя или значения по умолчанию (element_type) после Контракта. Утверждайте () вызов, зная, что это никогда не будут называть и закрытие компилятора? Или есть ли какой-либо другой более изящный способ сделать это?
Спасибо
Вы можете использовать
var result = null;
foreach (element in elementList) {
if (element is whatever)
result = element;
break;
}
}
Contract.Assert(result != null, "Invalid state!");
return result;
Он вводит разрыв, но выглядит чище вокруг возврата.
Еще чище было бы
return elementList.Where( e => e is whatever).First();
Edit, как отметил @devoured, вышеупомянутый вариант будет бить по всему списку
чище без where
return elementList.First( e => e is whatever);
end edit
Это просто взорвется, если ничего не найдено.
Но если вам действительно нужен assert, это может быть
var results = elementList.Where( e => e is whatever);
Contract.Assert(results.Count() == 1, "Boo");
return results.First();
но это тоже будет итерация всего списка.