2008-09-19 83 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