3

別のクラスのイベント ハンドラーにサブスクライブされているユーザー コントロールがいくつかあります。私は C# で CodeContracts を学んでいますが、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 
}

ここには、null 参照例外につながる可能性がある、安全でない可能性のあるコードがあります。静的アナライザーはおそらくチェックできないことを理解しています。実際の型は何でしょsenderう。しかし、それを証明できない場合に備えて、CodeContracts: Possibly calling a method on a null reference.

それとも、契約の考え方が間違っているのでしょうか? このようなエラーの通知を受け取るにはどうすればよいですか?

更新:

はい、Implicit Non-Null Obligation回答で提案されているように有効にしましたが、それでも静的アナライザーから警告が表示されません。また、ルールを設定してコード分析を実行しようとしましたがMicrosoft All Rules、警告もありませんでした。(ただし、if-then-throw などを使用するよりも、Code Contracts を処理し、Contract クラスを使用して追加のチェックを実行することをお勧めします)

4

4 に答える 4

3

静的アナライザー オプション (プロジェクト オプション|コード分析) で「暗黙的な非 Null 義務」を有効にする必要があります。

于 2011-11-18T18:48:37.173 に答える
0

「このようなエラーの通知を受け取るにはどうすればよいですか?」:その場合、Resharperは警告を表示します。

コードコントラクトは、オブジェクトがnull以外であるという「要件」がある場合、オブジェクトがnullになる可能性があることを警告します。オブジェクトの間接参照の暗黙的な「要件」を求めています。これは、一見合理的であるように見えますが、何らかの理由でどのCCが提供していないようです。

http://msdn.microsoft.com/en-us/library/dd264808.aspxのドキュメントには、このような暗黙の契約が適用されると記載されています。私はそれをさらに調査しています。

RedHatは私をそれに打ち負かしました。詳細:プロジェクトプロパティの[コードコントラクト]タブの[静的チェック]の下にある[暗黙の非ヌル義務]チェックボックスをオンにする必要があります。

于 2011-11-18T18:43:21.110 に答える
0

私も同様の問題を抱えていました。「ImplicitNon-Null義務」チェックボックスと同じパネルの警告レベルスライダーを上げる必要がありました。

于 2013-03-01T00:57:56.700 に答える
-1

コード分​​析タブのプロジェクトのプロパティページで、ルール変更できます。

于 2011-11-18T18:47:01.213 に答える