programing

VB.NET의 정수에 아무것도 할당할 수 없는 이유는 무엇입니까?

lovejava 2023. 5. 19. 23:53

VB.NET의 정수에 아무것도 할당할 수 없는 이유는 무엇입니까?

할당할 수 있는 이유NothingVB.NET의 값 형식으로:

Dim x as Integer = Nothing

하지만 저는 당신을 위해 할당할 수 없습니다.nullC#:

int x = null;

할당할 때NothingVB의 값 유형으로 변환합니다.Net이 기본값으로 해당 유형을 인스턴스화합니다.따라서 이 경우에는 null 정수가 아니라 기본값 0을 유지하는 정수를 만듭니다.

동등한 C# 코드는 다음과 같습니다.

int x;
x = default(int);

참조 유형의 경우에도 동일한 내용이 유지됩니다.

Dim y As Object
y = Nothing

그 VB.C#에 직접 매핑된 경우 Net 코드는 다음과 같습니다.

object y;
y = default(object);

에 대한 기본값은 그저 좋은 것입니다.object(또는 다른 참조 유형).넷이즈null그래서 우리는 VB를 봅니다.넷즈NothingC#과 직접 유사하지 않습니다.null적어도 값 형식과 함께 사용되는 경우.

언어 사양의 흥미로운 예: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=01eee123-f68c-4227-9274-97a13d7cb433&displaylang=en

7.1.1 Nullable Value Types 값 유형의 경우, ? 수식어를 해당 유형의 Nullable 버전을 나타내는 형식 이름에 추가할 수 있습니다.null 가능한 값 유형에는 null이 아닌 버전의 유형과 동일한 값과 null 값이 포함될 수 있습니다.따라서 null 가능한 값 유형의 경우 Nothing을 유형의 변수에 할당하면 변수 값이 값 유형의 0이 아닌 null 값으로 설정됩니다.예:

Dim x As Integer = Nothing
Dim y As Integer? = Nothing

' Prints zero
Console.WriteLine(x)
' Prints nothing (because the value of y is the null value)
Console.WriteLine(y)

대해서NothingVB.NET 사양(v.10):

특별한 리터럴은 없습니다. 형식이 없으며 형식 매개 변수를 포함하여 형식 시스템의 모든 형식으로 변환할 수 있습니다.특정 유형으로 변환할 경우 해당 유형의 기본값과 동일합니다.

C# 사양(v4)으로부터

null-literal은 암시적으로 참조 유형 또는 null 가능 유형으로 변환할 수 있습니다.

따라서 C# null은 암묵적으로 값 형식으로 변환할 수 없지만 VB.NET Nothing은 변환할 수 없습니다.

단, 설정x = Nothing에 해당하는 첫 번째 보기에서 명확하지 않기 때문에 혼란스럽습니다.x = 0.

특히 그럴 때는Nothing유효하지 않은 값이 될 것으로 예상됩니다.0유효한 경우 이 할당은 VB.NET 코드에서 오해나 암시적 버그를 가져올 수 있습니다.

다음은 VB.NET 및 Nothing vs.에 대한 흥미로운 기사입니다.특수합니다. 약간의 발췌:


...값 유형. 없음 또는 Null과 비교할 수 없습니다.값 유형은 정수 및 바이트와 같은 유형입니다.Visual Basic Language Reference에서 다음을 수행합니다.

값 유형은 값 없음을 유지할 수 없으며 값에 아무것도 할당하지 않으면 기본값으로 돌아갑니다.식에 값 유형을 입력하면 IsNothing은 항상 False를 반환합니다.

언급URL : https://stackoverflow.com/questions/2776902/why-can-you-assign-nothing-to-an-integer-in-vb-net