У меня есть большая база кода C#, в которой я пытаюсь реорганизовать и очистить чужой запутанный код. Недавно я наткнулся на такой кусок:Статически обнаруживать несоответствия типов в инструкции foreach
List<Bar> bars = ... ;
...
foreach (Foo foo in bars) { ... }
...
public class Bar
{
...
public static explicit operator Foo() { ... }
}
Этот тип несоответствия является проблемой. И, как и следовало ожидать, код не фактически работает: это ошибка, которая давно скрывается на виду.
Однако код legal. Ни Visual Studio 2013, ни ReSharper 2016 не жалуются на эту довольно очевидную ошибку: мне пришлось подождать, пока исключение во время выполнения не обнаружит, что код сломан. Я бы скорее узнал намного раньше.
Я искал как Visual Studio, так и опции ReSharper, пытаясь найти способ заставить мои инструменты обнаруживать такие типы несоответствий типов: «Шаблоны кода» ReSharper являются ближайшими, которые я могу получить, и хотя он может распознавать синтаксический шаблон при ошибке, он не поддерживает достаточно глубокий анализ типов, чтобы обнаружить ошибку.
Так кто-нибудь знает способ сделать ReSharper статически обнаруживать foreach
тип несоответствий? Или, альтернативно, кто-нибудь знает инструмент, который может?
Update: Первоначально я опущено, что существует explicit
пользовательский оператор литья из Bar
в Foo
- это explicit
, заметьте, не implicit
. Существование этого оператора литья, похоже, наносит ущерб способности инструментов обнаружить эту проблему. Я обновил код, чтобы показать поведение.
Какая версия R # вы используете? –
ReShaper 2016.1.2, выпущенный в мае 2016 года, чтобы быть конкретным. –
Ах! Я не видел обновления. Я собирался сказать вам, что не могу воспроизвести проблему, поскольку Resharper эффективно дает мне ошибку времени компиляции, но если есть явное преобразование, то единственный способ, который я вижу, - сначала перебрать фильтрацию, используя, например, list.OfType(). –