2011-01-14 2 views
1

VB 응용 프로그램에서 인터페이스를 정의 할 때 Visual Studio 2010에서 혼란 스럽거나 잠재적으로 버그가 발생했습니다. Double 형식의 기본 매개 변수로 인터페이스 메서드를 정의 할 때 Double.NaN 상수를 기본값으로 사용하면 코드 편집기/intellisense/precompiler에 몇 가지 문제가 발생합니다.인터페이스의 선택적 매개 변수에 Double.NaN 사용

다음 코드는 "INaNTest"및 인터페이스에 일치하는 하위가 없기 때문에 '해봐요'는 '해봐요'를 구현할 수없는 주장 "INaNTest.DoSomething"을 강조 'INaNTest'

Public Class NaNTest 
    Implements INaNTest 
    Public Sub DoSomething(ByVal x As Double, 
          Optional ByVal a As Double = Double.NaN) 
          Implements INaNTest.DoSomething 
    End Sub 
End Class 

Public Interface INaNTest 
    Sub DoSomething(ByVal x As Double, 
        Optional ByVal a As Double = Double.NaN) 
End Interface 

가 구현을 제거하고 시작 : 지금 "NaNTest는"선 "INaNTest를 구현"의 끝에 리턴 키를 치는, (클래스 'NaNTest'해야 ...) 밑줄된다

Public Class NaNTest 
    Implements INaNTest 
End Class 

Public Interface INaNTest 
    Sub DoSomething(ByVal x As Double, 
        Optional ByVal a As Double = Double.NaN) 
End Interface 

(즉, 자동으로 구현 삽입)를 추가합니다 구현 :

Public Sub DoSomething(ByVal x As Double, 
          Optional ByVal a As Double = -1.#IND) 
          Implements INaNTest.DoSomething 

    End Sub 

코드 편집기는 '#'(식별자가 필요함)에 밑줄을 긋습니다. 따라서 코드는 자동으로 옳지 않은 코드를 추가합니다. 밑줄 친 "INaNTest.DoSomething"의 오류 수정 옵션 버튼을 사용 INaNTest '에서'해봐요 '메서드 스텁 생성 "을 선택, 상기 원본 코드로 시작 이제 대안

, 첨가 방법 스텁은 :

Sub DoSomething(ByVal x As Double, 
        Optional ByVal a As Double = NaN) 

"NaN"은 "Double"과 이혼했습니다. 접두사와 밑줄이 그어져 있습니다 ('NaN'이 선언되지 않았습니다. 보호 수준으로 인해 액세스 할 수없는 경우가 있습니다). 코드 편집기에서 유효하지 않은 코드를 다시 삽입했습니다.

VB.net의 인터페이스에 정의 된대로 메서드의 기본값으로 Double.NaN을 사용하는 올바른 해결책이 있습니까? 아니면 불가능한 근본적인 이유가 있습니까?

많은 감사, JCollins

답변

1

윽, 그건 못 생기고있다. 이것을 버그가 아닌 다른 것으로 규정하기는 어렵습니다. IDE에서 메서드 서명을 생성 할 때 NaN의 기본 형식은 VB.NET 팀에서 사용하는 언어를 보여줍니다. 즉, C++ 런타임 라이브러리에서 NaN 형식을 지정하는 방식입니다. 자신이하는 일이 실제로 무엇인지 알기 위해 시도하는 것은 참으로 쓸데없는 일입니다.

connect.microsoft.com에서이를보고 할 수 있습니다. 당신을 기다리는 동안 '비주얼 스튜디오의 다음 버전에서 수정하는 것은'하루의 빛을 볼 수, 당신이 해결 방법으로 nullable 형식을 사용하는 것이 좋습니다 :

Public Class NaNTest 
    Implements INaNTest 
    Public Sub DoSomething(ByVal x As Double, Optional ByVal a As Double? = Nothing) Implements INaNTest.DoSomething 
     If a.HasValue Then 
      '' etc.. 
     End If 
    End Sub 
End Class 

Public Interface INaNTest 
    Sub DoSomething(ByVal x As Double, 
        Optional ByVal a As Double? = Nothing) 
End Interface 

FWIW, 그것은 당신이 더블을 사용 작업을 수행 . 기본값으로 엡실론. 바보 같지만 완전히 부당한 해결 방법은 아닙니다. IDE가 구현을 생성하지 못하게하면 바보가됩니다.

+0

감사합니다 Hans, 나는 Positive와 NegativeInfinity가 모두 작동한다는 것을 알았지 만, IDE가 작업을 수행하는 것이 아닙니다. NaN에 맞는 구문이 있는지, 아니면 원래 구문이 정확하고 IDE가 잘못 오류를 식별했는지 여부에 대해서는 여전히 궁금합니다. –

+0

Double.NaN은 올바른 구문입니다. 컴파일러의 결함으로 인해 작동하지 않습니다. 이것은 NaN의 이상한 행동에 의해 거의 확실하게 유도됩니다 : Double.NaN! = Double.NaN. 그들은 컴파일러에서 특별한 경우가 필요합니다. IDE의 이상한 동작은 별개의 문제입니다. –

관련 문제