6

Resharperは私にこのコードを変更することを望みました:

foreach (var item in cmbxColor1.Items)
{
    cmbxColor2.Items.Add(item);
    . . .

...「Possible'System.NullReferencesException'」と表示されているため

だからそれはこれでなければなりません:

foreach (var item in cmbxColor1.Items)
{
    if (null != cmbxColor2.Items)
    {
        cmbxColor2.Items.Add(item);
. . .

これはわかりません-null==が空でない限り、コンボボックスのアイテムをnullにするにはどうすればよいですか?そして、null ==が空の場合、このコードが呼び出されたとき、まさにそれが[s、w]になります。

4

3 に答える 3

4

ItemsのコレクションがComboBoxコンストラクターによって初期化されているように見えるため、ここでは Resharper が間違っていると思います。あれは:

ComboBox c = new ComboBox();
c.Items.Add("1");

OKであることが保証されています。

またget、ここではアクセサのみを使用できるため、このコレクションを別のコレクション (または ) に置き換えることはできませんnull。よくわかりませんが、派生中にこのコレクションに影響を与える可能性があった場合ComboBox(すぐに見つけることができませんでした)、それでも null ではないことが保証されていると思います。

于 2012-12-23T23:44:51.240 に答える
3

Null は空ではありません。

Resharper チームは、多くの .NET クラスの自動コード分析を行って、どのメソッドとプロパティが null を返すことができるかを判断しました。Resharper が null である可能性があると主張する場合、それはおそらく、実際に null である可能性がある (おそらくあいまいな) 方法があるためです。

外部ライブラリ (例: mscorlib.dll) を使用している場合、属性を使用してエンティティのコントラクトを指定することは現実的ではないようです。外部注釈を入力します。この ReSharper 機能を使用すると、ReSharper の分析エンジンで使用される属性を使用して、既にコンパイルされたエンティティを補完できます。外部アノテーションを使用すると、ライブラリのコンパイル時に宣言されていなかった属性 (メソッド、パラメーター、およびその他の宣言) をエンジンに表示させることで、エンジンを「ごまかす」ことができます。これを行うには、 にある XML ファイルで属性を指定する必要があります<ReSharper install directory>\Bin\ExternalAnnotations

これは、ReSharper のインストール時にこのフォルダーに格納される標準ライブラリーのコントラクトの定義です。これらの契約は、ソース コードの分析と Microsoft Contracts に基づいて取得されます。前者の手法を使用して取得されたコントラクトはタイプのファイルに*.Generated.xml保存され、後者の手法を使用して取得されたコントラクトはタイプのファイルに保存されます*.Contracts.xml

ただし、実際にはそうではない可能性が高いことに同意しnullます。また、Resharper が慎重すぎる可能性もあります。何かが null になる可能性があるかどうかを証明することは難しい問題です。分析が間違っていると思われ、修正したい場合は、注釈を変更できます。

関連している

于 2012-12-23T23:41:06.793 に答える
0

私はむしろこの方法を使用します。

foreach (var item in cmbxColor1.Items)
{
    if (cmbxColor2.Items.Count > 0)
    {
        cmbxColor2.Items.Add(item);
    }
}
于 2012-12-23T23:36:42.690 に答える