質問
これに出くわし、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'
あまりにも奇妙な...
解決
正しく覚えていれば、VBの「Nothing」は「デフォルト値」を意味します。値型の場合、それはデフォルト値であり、参照型の場合はnullになります。したがって、構造体に何も割り当てなくても問題はありません。
他のヒント
Nothing
は、関連するタイプの default(T)
とほぼ同等です。 (チェックしただけで、これは文字列にも当てはまります。つまり、 Nothing
は文字列のコンテキストではnull参照です。)
MSDNで検索しようとしましたが、VB側で関連するものが見つかりませんでした。 " struct"を検索する場合C#では、それが値型であり、nullを割り当てることができないことを明確に返します...これは値です。
ただし、VB.NETのキーワード" Structure"を見ると、 「値の種類」とは言いません。代わりに
と表示されます構造ステートメントは、 できる複合値タイプ カスタマイズします。
だから...オブジェクト?
それは私の推測でしょう。この動作を参照したいのですが、見つかりませんでした。
また、構造体は値型(int、charなどに似ている)であるため、null不可です。
Structureは複数の異なる型(単一の値型ではなく、複数の異なる型の可能な複合体)で構成されているため、「Nothing」かどうかを尋ねます。 " Nothing"の使用のロジックを壊します。テストしている型によってテストが異なることはないため、複雑な型は「Nothing」の使用ロジックに準拠していません。ただし、このタイプのテスト、つまり、すべてのコンポーネントメンバがそれぞれの「なし」にある構造では、値、関数" IsNothing"を使用します。例:
Public Class Employees
Public Structure EmployeeInfoType
Dim Name As String ' String
Dim Age as Integer ' Integer
Dim Salary as Single ' Single
End Structure
Private MyEmp as New EmployeeInfoType
Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean
If **IsNothing**(Employee) Then
Return True
Else
Return False
End If
End Function
End Class