Domanda

Mi sono imbattuto in questo e mi chiedevo se qualcuno potesse spiegare perché questo funziona in VB.NET quando mi aspetterei che dovrebbe fallire, proprio come succede 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

Ma poi in VB.NET ...

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

Niente non è lo stesso di null ( Nothing! = null - LOL?) , o sono solo modi diversi di gestire la stessa situazione tra le due lingue?

Perché o cosa viene gestito in modo diverso tra i due che rendono tutto ok in uno, ma non nell'altro?

[Aggiornamento]

Dati alcuni dei commenti, ho rovinato un po 'di più questo ... sembra che tu debba effettivamente usare Nullable se vuoi permettere che qualcosa sia nullo in VB.NET ... quindi per esempio .. .

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

Troppo strano ...

È stato utile?

Soluzione

Se ricordo correttamente, "Niente" in VB significa "il valore predefinito". Per un tipo di valore, questo è il valore predefinito, per un tipo di riferimento, sarebbe nullo. Pertanto, l'assegnazione di nulla a una struttura non è affatto un problema.

Altri suggerimenti

Nothing equivale approssimativamente a default (T) per il tipo pertinente. (Ho appena controllato, e questo vale anche per le stringhe, ovvero Nothing è un riferimento null nel contesto delle stringhe.)

Ho provato a cercarlo su MSDN ma non ho trovato nulla di rilevante sul lato VB. Durante la ricerca di " struct " su C #, restituisce chiaramente che è un Tipo valore e non può essere assegnato null poiché ... è un valore.

Tuttavia, quando si osserva la parola chiave VB.NET " Struttura " non dice " Tipo valore " ;. Invece dice

  

L'istruzione Structure definisce a   tipo di valore composito che è possibile   personalizzare.

Quindi ... oggetto?

Sarebbe la mia ipotesi. Vorrei avere riferimenti a questo comportamento ma non sono riuscito a trovarne.

Inoltre, le strutture sono tipi di valore (molto simili a int, char, ecc.) e quindi non sono annullabili.

Poiché una struttura è composta da probabilmente diversi tipi (non un tipo a valore singolo, ma un possibile composito di diversi tipi), per chiedere se è " Nothing " spezzerebbe la logica dell'uso di "Niente". Nulla viene testato in modo diverso a seconda del tipo che si sta testando e quindi un tipo complesso non aderisce alla logica dell'uso di "Niente". Tuttavia, per questo tipo di test, vale a dire, con una struttura che ha tutti i suoi componenti ai rispettivi "niente". valori, utilizziamo la funzione " IsNothing " ;. Ad esempio:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top