2011-03-25 3 views

답변

2

이 코드는 ldnull 다음에 ldvirtftn 명령으로 컴파일됩니다. ldvirtftn (4.18)에 대한 ECMA-335에서 :

System.NullReferenceException 객체가 null의 경우에 슬로우 입니다.

ToString은 호출하지 않지만 ldvirtftn 명령어는 ToString에 대한 함수 포인터를 평가 스택에로드하려고 시도합니다. 그렇게하려면 유효한 객체 참조가 필요합니다.

+0

그럼 코드를 새 Object()로 다시 작성했다고 가정 해 봅시다. Object가 public 생성자를 가지지 않는다면 나는 막혀있을 것 같습니다. 이 경우 우리는 무엇을 할 수 있습니까? – Dejas

+0

이 특별한 경우의 문제점은 ToString이 가상 메서드라는 것입니다 (따라서 ldftn 대신 ldvirtftn이 사용되는 이유). CLR은 클래스 계층에서 재정의 된 내용에 따라 실제 ToString에 대한 포인터를 반환 할 수 있도록 객체에 대한 참조가 필요합니다. 가상 메서드가 아닌 경우에도이 트릭을 수행하더라도 Func의 생성자는 전달 된 인스턴스에서 null을 확인하기 때문에 throw됩니다. 결론은 인스턴스 메소드에 대한 델리게이트를 구성하려는 경우 널이 아닌 참조가 필요하다는 것입니다. –

+0

@Dejas : 요약하면 : 인스턴스 메서드에 대한 대리자를 구성 할 수 있도록 형식의 인스턴스에 어떻게 든 도착해야합니다. 이전에 언급 한 이유 때문에 null 참조가 작동하지 않습니다. –

5
Func<Object> someMethod = new Func<Object>(((Object)null).ToString); 

그것은 실행되지,하지만 당신은 null 참조에 방법을ToString()에 액세스하려고합니다.

1

(null) null은 여전히 ​​null입니다. null.ToString()을 호출하려고하는데, 이것이 NullPointerException을 얻는 이유입니다.

+0

왜 누군가는 그런 일을 할 것입니다 .. – Bastardo

+0

기술적으로 코드는 ToString을 호출하지 않고 Func 의 (object, IntPtr) 생성자에 대한 함수 포인터로 전달합니다. –