在VisualStudio(Pro 2008)中,我刚注意到一些不一致的行为,并想知道它背后是否有任何逻辑推理
在WinForms项目中,如果我使用
行if(myComboBox.Items[i] == myObject)
我得到一个编译器警告我可能会得到'可能的非预期引用',因为我正在比较类型对象和类型MyObject。很公平。
但是,如果我改为使用界面进行比较:
if(myComboBox.Items[i] == iMyInterface)
编译警告消失了。
任何人都可以考虑是否存在任何逻辑上的原因,或者只是编译器的工件不检查接口的比较警告。有什么想法吗?
编辑在我的示例中,组合框已绑定到List,但该列表是使用list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()
生成的
就好像编译器只是假设我绑定到IMyInterface列表一样。
(已更改对象和接口方法以保护无辜者)
答案 0 :(得分:1)
第一个示例的编译警告是因为您的类的任何custom ==运算符都将被忽略并且引用被比较(可能不是您想要的,因此警告)。
无法指定应在接口上覆盖运算符,因此总是是参考比较。不需要警告,因为你应该总是期待这个。
以下是覆盖==运算符的示例:
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)。
答案 1 :(得分:0)
Lagerdalek,
生成警告是因为在比较之前需要将Items集合中的项目强制转换回绑定到组合框的原始类型;否则,您可能会在编译器发出警告时获得意外结果。
以下是一个例子:
myComboBox.DataSource = Collection<Car>;
因此,如果组合框绑定到 car 对象的集合,您可以在比较之前将它们转换回来:
if((car)myComboBox.Items[i] == thisCar)
然后你不应该收到任何警告。
你可以做的另一种方法是:
using(myComboBox.Items[i] as car){
if(myComboBox.Items[i] == thisCar)
}
让我知道。祝好运!我要从记忆中走出来,我希望我没有错误输入任何东西。 :O)