문제

나는 이것을 가로 질러 달렸고 누군가 C#에서와 마찬가지로 이것이 실패 할 것으로 예상 할 때 VB.net에서 왜 이것이 작동하는지 설명 할 수 있는지 궁금해했다.

//The C# Version

struct Person {
    public string name;
}
...
Person someone = null; //Nope! Can't do that!!
Person? someoneElse = null; //No problem, just like expected

그러나 vb.net에서 ...

Structure Person
    Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?

Null과 같지 않습니다 (아무것도! = null- lol?), 또는 이것은 두 언어 사이에서 동일한 상황을 처리하는 다른 방법입니까?

왜 또는 다른 하나는 이것을 괜찮게하는 두 가지 사이에서 다르게 처리됩니까?

업데이트

댓글 중 일부를 감안할 때, 나는 이것을 조금 더 엉망으로 만들었습니다 ... VB.net에서 무언가를 허용하려면 실제로 Nullable을 사용해야하는 것처럼 보입니다 ... 예를 들어 ...

'This is false - It is still a person'
Dim someone As Person = Nothing
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) 'false'

'This is true - the result is actually nullable now'
Dim someoneElse As Nullable(Of Person) = Nothing
Dim isSomeoneElseNull As Boolean = someoneElse.Equals(Nothing) 'true'

너무 이상한...

도움이 되었습니까?

해결책

내가 정확하게 기억한다면, VB의 '아무것도'는 "기본값"을 의미합니다. 값 유형의 경우, 기본 값, 참조 유형의 경우 NULL입니다. 따라서 구조물에 아무것도 할당하는 것은 전혀 문제가되지 않습니다.

다른 팁

Nothing 대략 동일합니다 default(T) 관련 유형의 경우. (방금 확인했는데 이것은 문자열도 마찬가지입니다 - 즉 Nothing 문자열의 맥락에서 무효 기준입니다.)

MSDN에서 검색하려고했지만 VB 측에서 관련된 것을 찾을 수 없었습니다. C#에서 "struct"를 검색 할 때 값 유형이며 널에 할당 할 수 없음을 분명히 반환합니다. 값입니다.

그러나 vb.net 키워드 "구조"를 살펴보면 "값 유형"이라고 말하지 않습니다. 대신 그것은 말한다

구조 문은 사용자 정의 할 수있는 복합 값 유형을 정의합니다.

그래서 ... 물건?

그것은 내 추측 일 것입니다. 이 행동에 대한 언급을하고 싶지만 찾을 수 없었습니다.

또한 스트러크는 값 유형 (int, char 등과 매우 유사)이므로 널리 없습니다.

구조는 몇 가지 다른 유형 (단일 값 유형이 아니라 여러 다른 유형의 복합재)으로 구성되기 때문에 "아무것도 없음"인지 묻는 것이 "아무것도 없음"의 사용의 논리를 깨뜨릴 것입니다. 테스트중인 유형에 따라 다르게 테스트하지 않으므로 복잡한 유형은 "Nothing"사용 논리를 준수하지 않습니다. 그러나 이러한 유형의 테스트의 경우 즉, 모든 구성 요소 구성원이 해당 "Nothing"값에있는 구조가있는 경우, 우리는 "IS NOTHING"기능을 사용합니다. 예를 들어:

Public Class Employees
    Public Structure EmployeeInfoType
       Dim Name As String    ' String
       Dim Age as Integer    ' Integer
       Dim Salary as Single  ' Single
    End Structure

    Private MyEmp as New EmployeeInfoType

    Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean
       If **IsNothing**(Employee) Then
          Return True
       Else
          Return False
       End If
    End Function
End Class
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top