Why can you assign Nothing to an Integer in VB.NET?

后端 未结 5 967
星月不相逢
星月不相逢 2021-01-17 07:22

Why am I allowed to assign Nothing to a value-type in VB.NET:

Dim x as Integer = Nothing

But I\'m not allowed to assign

相关标签:
5条回答
  • 2021-01-17 07:43

    When you assign Nothing to a value type in VB.Net it instantiates that type with its default value. So in this case you're not creating a null integer, but an integer that holds the default value of 0

    0 讨论(0)
  • 2021-01-17 07:48

    The equivalent C# code looks like this:

    int x;
    x = default(int);
    

    Note that for reference types, the same still holds:

    Dim y As Object
    y = Nothing
    

    That VB.Net code would look like this if mapped directly to C#:

    object y;
    y = default(object);
    

    It's just a nice thing that the default for object (or any other reference type) in .Net is null. So we see that VB.Net's Nothing is not a direct analog to C#'s null, at least when used with value types.

    0 讨论(0)
  • 2021-01-17 07:53

    An interesting example from the language spec: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=01eee123-f68c-4227-9274-97a13d7cb433&displaylang=en

    7.1.1 Nullable Value Types For value types, a ? modifier can be added to a type name to represent the nullable version of that type. A nullable value type can contain the same values as the non-nullable version of the type as well as the null value. Thus, for a nullable value type, assigning Nothing to a variable of the type sets the value of the variable to the null value, not the zero value of the value type. For example:

    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)
    
    0 讨论(0)
  • 2021-01-17 07:53

    About Nothing from the VB.NET specifications (v.10):

    Nothing is a special literal; it does not have a type and is convertible to all types in the type system, including type parameters. When converted to a particular type, it is the equivalent of the default value of that type.

    from C# specs (v4)

    The null-literal can be implicitly converted to a reference type or nullable type.

    So, C# null can't be implicitly converted to value types, but VB.NET Nothing can.

    However setting x = Nothing is confusing, because is not clear at first view that is equivalent to x = 0.

    Especially when Nothing is expected to be a invalid value and 0 - a valid one, this assignment can bring misunderstandings or even implicit bugs in the VB.NET code.

    0 讨论(0)
  • 2021-01-17 08:01

    Here's an interesting article about VB.NET and Nothing vs. Null. A small excerpt:


    ...value types, can’t be compared to Nothing or Null. Value types are types such as Integers and Bytes. From the Visual Basic Language Reference:

    A value type cannot hold a value of Nothing and reverts to its default value if you assign Nothing to it. If you supply a value type in Expression, IsNothing always returns False.

    0 讨论(0)
提交回复
热议问题