2011-08-18 2 views
1

두 값을 비교하여 0인지 확인하려고합니다. 다음은 작동합니다 0과 2를 비교할 때 같음 대 ==

Assert.IsTrue(0d==0); 

그러나이 실패합니다
Assert.IsTrue(Equals(0d,0)); 

나는 두 번째 인수 (0) 정수로 취급되고있다 생각합니다. 그러나 0d == 0이 참인 반면 Equals (0d, 0)는 false로 평가되는 이유를 이해할 수 없습니다. 두 값이 모두 0으로 직접 입력되므로 반올림 할 수 없습니다.

+0

"이중 값을 비교하려고합니다."- 그러나 당신은'decimal'과'int'를 비교합니다 –

+1

@Henk : 저는 여러분의 생각을 따르지 않을 것입니다. 십진수는 어디에 있습니까? –

+0

아니, 네 말이 맞아. 해당 m/d 접미사를 다시 트립합니다. –

답변

2

나는 Equals (0d, 0)가 타입 비교를하고 있을지도 모른다라고 생각한다. 0d는 동일한 유형이 아니기 때문에 기술적으로 0이 아닙니다.

편집 :

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

이 보인다 경우입니다.

MSDN : 지정한 개체가 현재 개체와 같으면 true이고, 그렇지 않으면 false입니다. 그렇지 않으면 false입니다.

또는 Convert.ToDouble (0)과 같이 사용할 수 있습니다. 지금 C# 컴파일러가 아니기 때문에 올바른지 확인할 수 없습니다.

4

직관적으로 "그들은 두 가지 복식이 아닙니다."만큼 쉽습니다.

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
public static bool Equals(object objA, object objB) 
{ 
    return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB))); 
} 

2 개의 참조가 동일하지 아니하며, 그래서 Double.Equals가 호출되는 null입니다 : 당신이 깊이 가고 싶은 경우

그러나, Object.Equals은 (당신이 당신의 두 번째 예제에 전화 정적 방법)이있다 사실상 :

public override bool Equals(object obj) 
{ 
    if (!(obj is double)) 
    { 
     return false; 
    } 
    double d = (double) obj; 
    return ((d == this) || (IsNaN(d) && IsNaN(this))); 
} 

인수는 double은 그래서 false을 반환하지 않습니다.

이것은 .NET 4.0 64 비트 용 mscorlib에서 가져온 것입니다.

+1

비교 구현을 포함 시키면 훨씬 더 흥미 롭습니다. int.CompareTo (double)는 double.CompareTo (int)와 같은 결과를 제공하지 않습니다. 열심히 생각하면 모든 경우를 설명 할 수 있지만 암시 적 변환을 고려해야합니다 (int에서 double로 변환 할 수 있지만 double에서 int로는 암시 적 변환을 수행 할 수 없음). 내 조언은 항상 명시적인 캐스트 또는 변환을 수행하여 동일한 숫자 형식의 값을 비교하는 것입니다. – Eddy

+0

내 대답 및 여기에 대한 의견 (int vs short)도 참조하십시오. http://stackoverflow.com/questions/6780002/generic-list-of-objects-contains-short-returning-false – Eddy

+0

+1, 항상 일반적인 유형을 사용하십시오! – Blindy

0

첫 번째 줄에서 == 연산자는 값을 일반적인 형식으로 캐스팅합니다. 두 번째에서는 Double.Equals 메서드가 결과로 호출되며 비교하기 전에 false를 반환하는 형식 검사가 수행됩니다. 하나의 값은 double이고 다른 하나는 integer입니다.