У меня есть несколько пользовательских элементов управления, которые подписаны на обработчик событий в другом классе.
Я изучаю CodeContracts на C #, и мне интересно, почему Static Analyzer позволяет писать такой код:
void MyUserControl_MouseEnter(object sender, MouseEventArgs e)
{
MyUserControl item = sender as MyUserControl;
item.DoSomething(); // I expect some warning here, because item can be null
sender.Equals(testObject); // This doesn't yield warning either
}
Здесь у меня есть потенциально небезопасный код, который может привести к исключению с нулевой ссылкой.
Я понимаю, что статический анализатор, вероятно, не может проверить, какой будет тип sender
. Но в случае, если это не может доказать это, я ожидаю некоторого предупреждения, такого как CodeContracts: Possibly calling a method on a null reference
.
Или я неправильно понимаю контракты? Как я могу получать уведомления об ошибках, подобных этой?
UPD:
Да, я включил Implicit Non-Null Obligation
, как было предложено в ответах, но я все еще не получаю предупреждение от Static Analyzer. Также я попытался запустить анализ кода с установленными правилами Microsoft All Rules
, также без предупреждения. (Но я бы предпочел иметь дело с Code Contracts и выполнять некоторые дополнительные проверки с использованием класса Contract, а не if-then-throw или чего-то еще)