이전 사례에서 필자는 null 인스턴스에서 확장 메서드를 호출하는 것이 합법적이라고 (아마도 권장하지 않지만) 인상적이었습니다. 그래서 C#에서,이 코드는 컴파일 및 실행 그러나이 확장 메서드가 VB.NET에서 NullReferenceException을 던지는 이유는 무엇입니까?
// code in static class
static bool IsNull(this object obj) {
return obj == null;
}
// code elsewhere
object x = null;
bool exists = !x.IsNull();
, 나는 그냥 내 개발 팀의 다른 구성원 함께 예제 코드의 작은 제품군을 넣고 있었어요 (우리는 단지 내가했습니다 .NET 3.5으로 업그레이드 팀이 우리에게 제공되는 새로운 기능의 속도를 높이는 작업을 할당 받았다.) 그리고 나는 을으로 VB.NET에 상응하는 코드로 작성하여 실제로는 NullReferenceException
을 던집니다. . 내가 작성한 코드는 다음과 같습니다.
' code in module '
<Extension()> _
Function IsNull(ByVal obj As Object) As Boolean
Return obj Is Nothing
End Function
' code elsewhere '
Dim exampleObject As Object = Nothing
Dim exists As Boolean = Not exampleObject.IsNull()
인스턴스 메서드를 호출 한 것처럼 바로 디버거가 멈 춥니 다. 내가 잘못된 것을하고 있습니까 (예 : C#과 VB.NET 사이의 확장 메서드를 정의한 방식에 약간의 차이가 있습니까?)? 실제로는 이 아니며은 VB.NET의 null 인스턴스에 대한 확장 메서드를 호출 할 수 있습니다. C#에서는 올바르지 만? (나는이 언어가 언어적인 것에 반대되는. NET 일 것이라고 생각했지만 아마도 틀 렸습니다.)
아무도 나에게이 설명을 할 수 있습니까?
이 ISNULL 방법 단지 예인가, 아니면 실제로 x.IsNull을 사용하고자 할 수 있습니다() 'x Is Nothing'또는 'x == null'대신에? – jrummell
@jrummell : 단지 예일뿐입니다. 앞에서 언급했듯이 일부 팀 구성원의 확장 방법이 어떻게 작동하는지 보여주기 위해 몇 가지 예제 코드를 작성했습니다. 이 메서드는 "확장 메서드를 사용하여 실제로이 작업을 수행 할 수 있지만 권장하지는 않지만 실제로는 확장 메서드를 정적 메서드로 사용하는 방법"을 보여주기 위해 주석에 포함 시키려고했습니다.) 방법. 그런데 나는 VB에서 그것을 할 수 없다는 것을 발견했다. –
발견 된 바와 같이, 이것은 늦은 바인딩에 대한 지원으로 인해 ... 당신처럼 (단) 나는 VB 바인딩 지원에 대한 지원이 없다는 것을 깨달았습니다. VB6과의 호환성 문제라고 생각합니다. 약간의 문제는 다른 개발자를위한 표준/교육에 대한 계획을 세우려는 경우 Option Strict가 많은 잠재적 인 문제를 해결하는 데 도움이된다고 생각하는 것입니다. 물론 YMMV. –