문제

VisualStudio(Pro 2008)에서 일관되지 않은 동작을 발견했으며 그 뒤에 논리적인 이유가 있는지 궁금합니다.

WinForms 프로젝트에서 다음 라인을 사용하면

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

유형 객체를 MyObject 유형과 비교할 때 '의도하지 않은 참조 가능성'이 발생할 수 있다는 컴파일러 경고가 표시됩니다.그럴 수 있지.

그러나 대신 인터페이스를 사용하여 비교하는 경우:

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

컴파일 경고가 사라집니다.

이것이 발생해야 하는 논리적인 이유가 있는지 또는 비교 경고에 대해 인터페이스를 확인하지 않는 컴파일러의 인공물이 있는지 누구나 생각할 수 있습니다.이견있는 사람?

편집하다 내 예에서는 콤보박스가 목록에 바인딩되었지만 해당 목록은 다음을 사용하여 생성되었습니다. list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()

이는 마치 내가 IMyInterface 목록에 바인딩한다고 가정할 때 컴파일러가 여전히 작업을 수행하는 것과 같습니다.

(무고한 사람을 보호하기 위해 객체 및 인터페이스 방법이 변경되었습니다)

도움이 되었습니까?

해결책

첫 번째 샘플에 대한 컴파일 경고는 클래스에 대한 사용자 정의 == 연산자가 무시되고 참조가 비교되기 때문입니다(의도한 것이 아닐 수도 있으므로 경고가 표시됨).

인터페이스에서 연산자를 재정의해야 한다고 지정할 수는 없습니다. 언제나 참고 비교가 되세요.항상 이를 예상해야 하기 때문에 경고는 필요하지 않습니다.

다음은 == 연산자를 재정의하는 예입니다.

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 클래스는 Key 속성이 동일하면 동일한 것으로 간주됩니다.인터페이스를 생성하려는 경우 사용자 정의 == 연산자를 포함해야 한다고 지정할 수 없으므로 비교는 항상 참조 비교가 됩니다(따라서 샘플 코드의 경우 false).

다른 팁

라거달렉,

비교하기 전에 Items 컬렉션의 항목을 콤보 상자에 바인딩된 원래 유형으로 다시 캐스팅해야 하기 때문에 경고가 생성됩니다.그렇지 않으면 컴파일러가 경고한 대로 예상치 못한 결과를 얻을 수 있습니다.

예는 다음과 같습니다.

myComboBox.DataSource = Collection<Car>;

따라서 콤보 상자가 다음 컬렉션에 바인딩되어 있으면 자동차 비교하기 전에 다시 캐스팅할 객체:

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

그러면 어떤 경고도 받아서는 안 됩니다.

당신이 할 수 있는 또 다른 방법은 다음과 같습니다:

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

알려줘요.행운을 빌어요!기억이 가물가물해서 아무것도 잘못 입력하지 않았으면 좋겠습니다.:영형)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top