1

VisualStudio (Pro 2008) で、いくつかの一貫性のない動作に気付き、その背後に論理的な理由があるかどうか疑問に思いました

WinForms プロジェクトで、次の行を使用すると

if(myComboBox.Items[i] == myObject)

オブジェクト型を MyObject 型と比較しているときに、「意図しない参照の可能性」が発生する可能性があるというコンパイラ警告が表示されます。けっこうだ。

ただし、代わりにインターフェイスを使用して比較すると、次のようになります。

if(myComboBox.Items[i] == iMyInterface)

コンパイル警告は消えます。

これが発生する論理的な理由があるのか​​ 、それともコンパイラのアーティファクトで比較警告のインターフェイスをチェックしないのか、誰でも考えることができます。何かご意見は?

編集私の例では、コンボボックスはリストにバインドされていましたが、そのリストは次を使用して生成されましたlist<IMyInterface>.Cast<MyObject>().ToList<MyObject>()

あたかも私が IMyInterface のリストにバインドしていると仮定して、コンパイラはまだ取っているかのようです。

(無実を保護するために、オブジェクトとインターフェイスのメソッドが変更されました)

4

2 に答える 2

1

最初のサンプルのコンパイル警告は、クラスのカスタム == 演算子が無視され、参照が比較されるためです (おそらく意図したものではないため、警告が表示されます)。

インターフェイスで演算子をオーバーライドするように指定することはできないため、これは常に参照比較になります。常にこれを予期する必要があるため、警告は必要ありません。

== 演算子をオーバーライドする例を次に示します。

class Program
{
    static void Main(string[] args)
    {
        object t1 = new MyTest() { Key = 1 };
        MyTest t2 = new MyTest() { Key = 1 };

        Console.WriteLine((MyTest)t1 == t2); // Uses overriden == operator, returns true
        Console.WriteLine(t1 == t2); // Reference comparison, returns false
    }
}

public class MyTest
{
    public int Key { get; set; }

    public override bool Equals(object obj)
    {
        return this.Key == (obj as MyTest).Key;
    }

    public override int GetHashCode()
    {
        return this.Key.GetHashCode();
    }

    public static bool operator ==(MyTest t1, MyTest t2)
    {
        return t1.Equals(t2);
    }

    public static bool operator !=(MyTest t1, MyTest t2)
    {
        return !t1.Equals(t2);
    }

}

Key プロパティが等しい場合、MyTest クラスは等しいと見なされます。インターフェイスを作成する場合、カスタム == 演算子を含めるように指定することはできないため、比較は常に参照比較になります (したがって、サンプル コードの場合は false)。

于 2008-10-04T21:46:45.630 に答える
0

Lagerdalek、

比較する前に、Itemsコレクションのアイテムをコンボボックスにバインドされた元のタイプにキャストし直す必要があるため、警告が生成されます。そうしないと、コンパイラが警告するときに予期しない結果が生じる可能性があります。

次に例を示します。

myComboBox.DataSource = Collection<Car>;

したがって、コンボボックスがのオブジェクトのコレクションにバインドされている場合は、比較する前にそれらをキャストバックします。

if((car)myComboBox.Items[i] == thisCar)

そうすれば、警告は表示されないはずです。

あなたができる別の方法は次のとおりです。

using(myComboBox.Items[i] as car){
 if(myComboBox.Items[i] == thisCar)
}

お知らせ下さい。幸運を!私は記憶から行きます、私は私が何もタイプミスしなかったことを望みます。:o)

于 2008-09-19T01:39:26.670 に答える