programing

3차 연산자 VB vs C#: 왜 아무것도 0으로 해결하지 않습니까?

powerit 2023. 5. 18. 21:30
반응형

3차 연산자 VB vs C#: 왜 아무것도 0으로 해결하지 않습니까?

저는 그냥 제 발을 쏘고 이 상황을 가능하게 할 실제적인 이유가 있었는지 알고 싶습니다.
그리고 어쨌든, 이 질문은 미래의 풋슈터들의 편의를 위해 남을 수 있습니다.


vb.net 에 null 가능한 값이 있다고 가정합니다.

Dim i as Integer?

조건을 기반으로 삼원 연산자를 사용하여 값을 할당하고 싶습니다. 왜냐하면 매우 깔끔하고 유용하기 때문입니다.

i = If(condition(), Nothing, 42)

즉, 조건이truenullability를 사용하고, 그렇지 않은 경우 값을 사용합니다.
총격이 발생하는 시점입니다.명백한 이유 없이 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의.NothingC#의 값과 직접적으로 일치하지 않음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.ValueNothing...

에 많은우에경에▁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

반응형