2012-09-12 1 views
1

나는 BigInteger를위한 문서보고를 가로 질러 달렸다하여 BigInteger.Equals(Object obj) 방법 다음BigInteger.Equals (Object obj)의 암시 적 캐스트는 어떻게 작동합니까?

하여 obj 매개 변수를 BigInteger 값이 아닙니다, 그러나 암시 적 변환이 정의되는 데이터 유형 인 경우, Equals (Object) 메서드는 비교를 수행하기 전에 obj를 BigInteger 값으로 변환합니다.

그런 다음 오브젝트에서 변환하면 명시 적 형변환이 필요하다는 점을 감안할 때 어떻게해야하는지 궁금해졌습니다. 내가 생각해 낸 가장 좋은 방법은 다음과 같습니다.

내가 할 수있는 쉬운 방법이 없다고 생각됩니다. 그렇다면 객체로 시작하는 암시 적 변환을 수행하는 다른 방법은 무엇입니까?

+0

Reflector를 사용하면'return obj! = null && obj는 BigInteger입니다. && this.Equals ((BigInteger) obj);'가됩니다. – Rawling

+0

'return ((obj is BigInteger)) && this.Equals ((BigInteger) obj)); ' – asawyer

+0

@asawyer 실제로 ILSpy를 사용하므로 차이가있을 수 있습니다. – Rawling

답변

3

ILSpy에서 현재 구현은 : 최소한

return obj is BigInteger && this.Equals((BigInteger)obj); 

문서의 표현에 오해의 소지가 고려 될 수있다. 이것이 의미하는 것은 BigInteger 또는 에서 파생되는 모든 것입니다.BigInteger에 대한 암시 적 캐스트를 가지므로 동등성을 테스트하기 위해 BigInteger으로 캐스트됩니다.

struct의 현재 정의는 BigInteger에서 파생 될 수있는 것이 아무것도 없음을 의미하므로 문서는 사실 그 진술에서 약간 무의미합니다.

당신이 코드에서 int, short, 등이 BigInteger "암시"에 저장 될 수 있도록하는 데 사용 된 것입니다 무엇을 사용자 정의 implicit 연산자와 혼동지고있다 :

BigInteger b = 1; 
+0

타입이 암시 적으로 'BigInteger'가 암시 적으로 변환되는 조건은 무엇입니까? 여기서'obj is BigInteger'는 false를 반환합니까? – Servy

+0

@Servy'implicit' 연산자는 (적어도 내 테스트 코드에서는)'is' 연산자의 동작을 고려하지 않습니다. 그래서,'BigInteger'에 들어갈 수있는 모든 정수형은'BigInteger'가 false를 반환하는 조건입니다. 즉, BigInteger 자체 나 상속 체인의 어떤 것 (구조체이므로 불가능합니다)). –

+0

'implicit' 연산자가 실제로 "실제"암시 적 변환을 실제로 생성하지 않기 때문입니다. 이것은 단지 컴파일 타임 구조입니다. 런타임에 사용자가 만든'implicit' 메소드는 아무런 영향을 미치지 않습니다. "실제"암시 적 변환은 본질적으로 여기에 표시된 코드가 작동하는 모든 시간 (즉, 'BigInteger'의 하위 클래스 인 클래스)입니다. – Servy