Visual Studio 组合框项比较和编译器警告

slmsl1lt  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(172)

在VisualStudio(Pro2008)中,我刚刚注意到一些不一致的行为,并想知道在其背后是否有任何逻辑推理
在WinForms项目中,如果我使用

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

我得到一个编译器警告,我可能会得到'可能的意外引用',因为我正在比较类型object和类型MyObject。
但是,如果我使用接口来比较:

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

编译警告就会消失。
有没有人能想一想为什么会发生这种情况,或者只是编译器的一个工件,没有检查接口的比较警告。有什么想法吗?

EDIT在我的示例中,组合框绑定到List,但该列表是使用list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()生成的

这就好像编译器只是假设我绑定到IMyInterface的List。
(对象和接口方法已更改,以保护无辜者)

thigvfpy

thigvfpy1#

第一个示例的编译警告是因为类的任何自定义==运算符都将被忽略,并将比较引用(可能不是您想要的,因此出现警告)。
不可能指定一个操作符应该在接口上被覆盖,所以这将 * 总是 * 是一个引用比较。不需要警告,因为你应该总是期望这样。
下面是一个重写==操作符的例子:

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)。

wfsdck30

wfsdck302#

拉格达莱克
生成该警告的原因是,在进行比较之前,需要将Items集合中的项强制转换回绑定到组合框的原始类型;否则你可能会得到意想不到的结果,因为编译器警告。
下面是一个例子:

myComboBox.DataSource = Collection<Car>;

因此,如果组合框绑定到一个car对象的集合,你会在比较之前将它们强制转换回来:

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

那你就不应该收到任何警告
你可以做的另一个方法是:

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

让我知道。祝你好运!我从记忆中走出来,我希望我没有打错任何东西。:o)

相关问题