2013-05-24 2 views
1

을 사용하여 비교되면 NDepend 규칙이 경고합니다 : C#/net 코드에 NDepend 규칙 (CQLinq)이 필요합니다. 주어진 유형의 인스턴스가 = = (참조 비교). 즉, 나는 프로그래머가 .Equals를 사용하도록하고 싶다.주어진 유형의 객체가 ==

해당 유형에는 오버로드 된 항등 연산자가 없습니다.

이것이 가능합니까? 그렇다면 어떻게? :)

감사합니다, 환호, 팀 ==는 IL 명령어로 변환, 값 유형에 대한 것을 볼 다음과 같은 코드로

답변

1

: ceq합니다. 이런 종류의 사용법은 NDepend에서는 감지 할 수 없습니다.

 int i = 2; 
    int j = 3; 
    Debug.Assert(i == j); 
    var s1 = "2"; 
    var s2 = "3"; 
    Debug.Assert(s1 == s2); 

그러나 참조 형식 위해 우리 op_Equality라는 연산자 메소드가 호출되는 것을 볼 수있다.

L_001d: call bool [mscorlib]System.String::op_Equality(string, string) 

는 따라서 우리는 단지 첫 op_Equality라는 이름의 모든 방법과 일치하고 이러한 방법의 모든 발신자 목록 CQLinq 쿼리가 필요합니다. 처럼이 볼 수 :이 "op_Equality는"작동 방법을 일치, 꽤 잘 작동 :)

enter image description here

+0

감사합니다, 패트릭 보인다

let equalityOps = Methods.WithSimpleName("op_Equality") from m in Application.Methods.UsingAny(equalityOps) select new { m, typesWhereEqualityOpCalled = m.MethodsCalled.Intersect(equalityOps).Select(m1 => m1.ParentType) } 

나는 같은 발견, - 불행하게도, 때 그것에 대해 조금 더 생각해 보았습니다. 결과적으로 "주어진 유형의 객체가 ==를 사용하여 비교되었지만 null과 비교되지 않을 경우 경고합니다"라는 규칙이 실제로 필요하다는 결론에 도달했습니다. 그래서 평등/불평등 연산자를 오버로딩하고 값 유형으로 내 유형을 처리하여이 문제를 해결했습니다. 어쨌든, 노력에 감사드립니다! –

+0

당신은 환영합니다. Tim, "그러나 null과 비교하면 그렇지 않습니다."실제로 NDepend와 일치 할 수없는 것이 었습니다. –

관련 문제