2008-09-19 86 views
1

在VisualStudio中(專業版2008年),我剛纔注意到一些不一致的行爲,並想知道是否有它後面的任何邏輯推理組合框項目比較和編譯器警告

在WinForms項目,如果我用線

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

我得到一個編譯器警告,我可能會得到'可能的意外引用',因爲我正在比較類型對象到類型MyObject。很公平。

但是,如果我不是使用一個接口來比較:

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

編譯警告消失。

任何人都可以認爲,如果有任何邏輯的原因,爲什麼會發生這種情況,或者只是編譯器的工件不檢查接口比較警告。有什麼想法嗎?

編輯在我的例子中,組合框被綁定到一個列表,但使用list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()

它作爲如果編譯器只服用仍然假設我結合IMyInterface的名單已於生成的列表。

(對象和接口中的方法已被更改,以保護無辜)

回答

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); 
    } 

} 

的MyTest的類被認爲是相等的,如果關鍵屬性是相同的。如果你要創建一個接口,你不能指定它應該包含一個自定義的==運算符,因此比較總是一個引用比較(因此在我們的示例代碼中是錯誤的)。

0

Lagerdalek,產生

的警告,因爲你需要從項目集合投項目放回原單類型爲界在組合框之前,比較;否則在編譯器發出警告時可能會收到意想不到的結果。

這裏有一個例子:如果組合框綁定到汽車集合對象,你會比較之前投他們回來

myComboBox.DataSource = Collection<Car>; 

所以:

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

然後你不該」沒有任何警告。

你可以做的另一種方法是:

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

讓我知道。祝你好運!我從記憶中回憶,希望我沒有錯誤輸入任何內容。 :o)

+0

奇怪的是我的組合被綁定到對象類型的列表,而不是接口類型,但是對象列表是使用Cast <>()。ToList <>()函數從接口列表生成的。很奇怪。感謝您的輸入 – johnc 2008-09-19 01:50:08