3차 연산자 VB vs C#: 왜 아무것도 0으로 해결하지 않습니까?
저는 그냥 제 발을 쏘고 이 상황을 가능하게 할 실제적인 이유가 있었는지 알고 싶습니다.
그리고 어쨌든, 이 질문은 미래의 풋슈터들의 편의를 위해 남을 수 있습니다.
vb.net 에 null 가능한 값이 있다고 가정합니다.
Dim i as Integer?
조건을 기반으로 삼원 연산자를 사용하여 값을 할당하고 싶습니다. 왜냐하면 매우 깔끔하고 유용하기 때문입니다.
i = If(condition(), Nothing, 42)
즉, 조건이true
nullability를 사용하고, 그렇지 않은 경우 값을 사용합니다.
총격이 발생하는 시점입니다.명백한 이유 없이 VB 컴파일러는 다음에 대한 공통 기본 유형을 결정합니다.Nothing
그리고.Integer
이라Integer
이 시점에서 자동으로 문을 다음으로 변환합니다.
i = If(condition(), 0, 42)
C#에서 이 작업을 수행할 경우:
i = (condition()) ? null : 42;
당신은 즉시 컴파일러 오류가 발생할 것입니다.<null>
와 잘 어울리지 않음int
잘됐네요, 제가 이번에 C# 길을 갔더라면 제 발이 더 건강했을 텐데요.그리고 이것을 컴파일하려면 다음과 같이 명시적으로 작성해야 합니다.
i = (condition()) ? null : (int?)42;
이제 VB에서도 동일한 작업을 수행하여 다음과 같은 정확한 null 값을 얻을 수 있습니다.
i = If(condition(), Nothing, CType(42, Integer?))
하지만 그러기 위해서는 우선 발을 쏘아야 합니다.컴파일러 오류도 없고 경고도 없습니다.그것으로 끝입니다Explicit On
그리고.Strict On
.
그래서 제 질문은, 왜죠?
이것을 컴파일러 버그로 받아들여야 합니까?
아니면 누가 컴파일러가 왜 이런 식으로 동작하는지 설명할 수 있습니까?
왜냐하면 VB의.Nothing
C#의 값과 직접적으로 일치하지 않음null
.
예를 들어 C#에서 이 코드는 컴파일되지 않습니다.
int i = null;
근데 이 VB는.넷 코드는 정상적으로 작동합니다.
Dim i As Integer = Nothing
VB.Net의Nothing
실제로 C#과 더 가까운 일치입니다.default(T)
표현.
3진수 연산자는 한 가지 유형만 반환할 수 있습니다.
C#에서는 다음을 기준으로 유형을 선택하려고 합니다.null
그리고.42
.음.null
유형이 없기 때문에 3항 연산자의 반환 유형은 다음과 같이 결정됩니다.42
평범한 노인int
그러면 일반 오래된 것으로 null을 반환할 수 없기 때문에 불만이 제기됩니다.int
당신이 42를 강요할 때int?
3차 연산자는 an을 반환할 것입니다.int?
,그렇게null
가 유효합니다.
VB에 대해서는 잘 모르겠지만 MSDN에서 인용하자면,
Assigning Nothing to a variable sets it to the default value for its declared type.
즉, VB는 3진 연산자가 다음을 반환할 것이라고 결정하기 때문입니다.int
(C#과 동일),Nothing
이라0
다시, 강요하는 것.42
…에 능통한 int?
턴Nothing
인 의기으로로int?
,어느 것이null
예상하신 대로
나는 이것이 아무것도 아닌 것보다 IF와 더 관련이 있다고 생각합니다.다음 코드를 고려하십시오.
''# This raises an exception
Dim x As Integer?
x = If(True, Nothing, Nothing)
MessageBox.Show(x.Value)
''# As does
Dim x As Integer?
x = Nothing
MessageBox.Show(x.Value)
''# Changing one of the truthpart arguments of If is what seems to return the zero.
Dim x As Integer?
x = If(True, Nothing, 5)
MessageBox.Show(x.Value)
왜 이것이 이것을 하는지 저는 여전히 모릅니다, 아마도 VB 팀에게 질문을 할 것입니다.Nothing 키워드나 Nullable과 관련이 없다고 생각합니다.
Nothing
그리고.null
같은 것이 아닙니다...MSDN에서:
변수에 아무것도 할당하지 않으면 선언된 유형의 기본값으로 설정됩니다.
또한.
식에 값 유형을 입력하면 IsNothing은 항상 False를 반환합니다.
int?는 null 형식이지만 여전히 참조 형식이 아닌 값 형식입니다.
보십시오정오로 설정해 .DbNull.Value
에 Nothing
...
에 많은우에경에▁in.Nothing
기본값으로 변환됩니다.사용하기Nothing
당신이 사용하는 것과 같은 방법.null
올바른 null 가능 유형으로 캐스팅해야 합니다.
Dim str As String
Dim int As Nullable(Of Integer) ' or use As Integer?
Dim reader As SqlDataReader
Dim colA As Integer = reader.GetOrdinal("colA")
Dim colB As Integer = reader.GetOrdinal("colB")
str = If(reader.IsDBNull(colA), DirectCast(Nothing, String), reader.GetString(colA))
int = If(reader.IsDBNull(colB), DirectCast(Nothing, Nullable(Of Integer)), reader.GetInt32(colB))
정수가 참조 유형이 아니기 때문에 이 문제가 발생합니다.nothing'은 참조 유형에만 사용할 수 있습니다.값 유형을 할당하는 경우 Nothing(아무것도 할당하지 않음)은 자동으로 기본값(Integer 0의 경우)으로 변환됩니다.
이제 VS2015에서 새 정수를 사용하여 실제로 가능합니까?
예:
if(testInt > 0, testInt, 새 정수?), 여기서 testInt가 Integer 유형입니까?
언급URL : https://stackoverflow.com/questions/4147277/ternary-operator-vb-vs-c-why-resolves-nothing-to-zero
'programing' 카테고리의 다른 글
UITapGesture Recognizer가 있는 뷰 내부의 UIButton (0) | 2023.05.18 |
---|---|
키 값 데이터 저장소에 디렉터리 계층 저장 (0) | 2023.05.18 |
Pymongo 결과에서 _id 요소 제거 (0) | 2023.05.18 |
Ctrl-스페이스를 누르지 않은 이클립스의 Ctrl-스페이스 (0) | 2023.05.18 |
BOM 없이 UTF-8로 엑셀 데이터를 내보낼 수 있습니까? (0) | 2023.05.18 |