23

私はこれに出くわし、C#の場合と同じように、VB.NETで失敗すると予想されるのに、なぜこれが機能するのかを誰かが説明できるかどうか疑問に思っていました.

//The C# Version

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

しかし、VB.NETでは...

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

Nothing は null ( Nothing != null - LOL?)と同じではありませんか、それとも 2 つの言語間で同じ状況を処理する方法が異なるだけですか?

2つの間で処理が異なるのはなぜですか?

[アップデート]

コメントのいくつかを考えると、私はこれをもう少し台無しにしました...VB.NETで何かをnullにすることを許可したい場合は、実際にNullableを使用する必要があるようです...たとえば...

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

奇妙すぎる...

4

5 に答える 5

30

私の記憶が正しければ、VBの「Nothing」は「デフォルト値」を意味します。値型の場合、これがデフォルト値であり、参照型の場合、これはnullになります。したがって、構造体に何も割り当てなくても問題はありません。

于 2008-11-19T21:55:10.650 に答える
12

Nothingdefault(T)関連するタイプとほぼ同等です。(チェックしたばかりで、これは文字列にも当てはまります。つまりNothing、文字列のコンテキストではnull参照です。)

于 2008-11-19T21:57:46.480 に答える
1

MSDNで検索しようとしましたが、VB側に関連するものが見つかりませんでした。C#で「struct」を検索すると、それが値型であり、nullを割り当てることができないことを明確に返します...これは値です。

ただし、VB.NETのキーワード「Structure」を見ると、「ValueType」とは表示されていません。代わりにそれは言う

Structureステートメントは、カスタマイズ可能な複合値タイプを定義します。

だから...オブジェクト?

それは私の推測です。この動作への参照が欲しいのですが、見つかりませんでした。

于 2008-11-19T22:01:19.170 に答える
0

また、構造体は値型(int、charなど)であるため、null許容ではありません。

于 2008-11-19T22:00:23.150 に答える