質問

これに出くわし、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top