views:

2596

answers:

4

I ran across this and was wondering if someone could explain why this works in VB.NET when I would expect it should fail, just like it does in C#

//The C# Version

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

But then in VB.NET...

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

Is Nothing not the same as null (Nothing != null - LOL?), or is this just different ways of handling the same situation between the two languages?

Why or what is handled differently between the two that makes this okay in one, but not the other?

[Update]

Given some of the comments, I messed with this a bit more... it seems as if you actually have to use Nullable if you want to allow something to be null in VB.NET... so for example...

'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'

Too weird...

+16  A: 

If I remember correctly, 'Nothing' in VB means "the default value". For a value type, that's the default value, for a reference type, that would be null. Thus, assigning nothing to a struct, is no problem at all.

BFree
Very interesting
Hugoware
Very interesting indeed! So in this case: `Nothing` is not `Nothing`...
awe
+4  A: 

Nothing is roughly equivalent to default(T) for the relevant type. (Just checked, and this is true for strings as well - i.e. Nothing is a null reference in the context of strings.)

Jon Skeet
A: 

Also, structs are value types (much like int, char, etc.) and thus are non-nullable.

Dana
Well using Nullable or ? (C#), you can make a struct null. That's why I was so shocked when it worked with VB.NET without using Nullable.
Hugoware
@HBoss: Using nullable, you can make ANYTHING null! Even an `Integer`.I was astonished by the accepted answer by **BFree**, and luckily it answered my question that led me to this post: How can you initialize a Structure with it's default value... ;)
awe
+1  A: 

I tried to search for it on MSDN but couldn't find anything relevant on the VB side. When searching for "struct" on C#, it clearly returns that it's a Value Type and can't be assigned null since... it's a value.

However, when looking on VB.NET keyword "Structure" it doesn't say "Value Type". Instead it says

The Structure statement defines a composite value type that you can customize.

So... object?

That would be my guess. I would like to have references to this behavior but couldn't find any.

Maxim
No, object would be `Class` , which is null as default. Structure is a complex value type that can be built up of several values, and even methods. The practical difference to `Class` is that `Structure` is initialized with an actual instance. Initializing it with `Nothing` just specifies that it should be set to its default value, which is NOT null (or as we usually say in VB: Nothing)
awe