Me encontré con esto y me preguntaba si alguien podría explicar por qué esto funciona en VB.NET cuando yo esperaría que en caso de fallar, igual que se hace en 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
Pero, a continuación, en VB.NET…
Structure Person
Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
No es Nada no es la misma como null (Nada != null – LOL?), o se trata simplemente de diferentes formas de manejo de la misma situación entre los dos idiomas?
Por qué, o qué es manejado de manera diferente entre los dos, que hace que este bien en uno, pero el otro no?
[Actualización]
Dado algunos de los comentarios, he metido con esto un poco más… parece como si en realidad tienes que utilizar acepta valores null si desea permitir que algo sea nulo en VB.NET… por ejemplo…
'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'
Demasiado raro…
- Me tropecé a través mientras que trasladar algunos VB.NET a C# – me hace odiar VB.NET que mucho más ;). Gracias por la excavación en esto, y gracias a los que respondieron.
- Véase también stackoverflow.com/questions/5869661/…
- debo odiar a C#, por ser diferente de VB? Algunas de las personas a resolver problemas. Parte de la culpa idiomas por ser diferente.
Si recuerdo correctamente, ‘Nada’ en VB significa el «valor predeterminado». Para un tipo de valor, que es el valor predeterminado para un tipo de referencia, que sería nulo. Por lo tanto, la asignación de la nada a una estructura, no es ningún problema en absoluto.
Nothing
no esNothing
…Nothing
es aproximadamente equivalente adefault(T)
para el tipo correspondiente. (Acabo de comprobar, y esto es cierto para las cadenas así – es decir,Nothing
es una referencia nula en el contexto de las cadenas.)IsNothing("")
o"" Is Nothing
devuelveTrue
. Tal vez ambos. Si no es tanto, la discrepancia es terrible.Traté de buscarlo en la web de MSDN, pero no podía encontrar nada relevante en la VB lado. Cuando la búsqueda para «struct» en C#, es evidente que devuelve que es un Tipo de Valor y no se puede asignar null ya que… es un valor.
Sin embargo, cuando se mira en VB.NET la palabra «Estructura» no dice «Tipo de Valor». En lugar de ello, dice
Así que… objeto?
Que sería mi suposición. Me gustaría tener referencias a este comportamiento, pero no pudo encontrar ninguna.
Class
, que es null como valor predeterminado. La estructura es un complejo tipo de valor que puede ser construido de varios valores, e incluso métodos. La diferencia práctica paraClass
es queStructure
se inicializa con una instancia real. Inicializarla conNothing
sólo especifica que se debe ajustar a su valor por defecto, que NO es nulo (o como solemos decir en VB: Nada)También, las estructuras son tipos de valor (como int, char, etc.) y por lo tanto no los aceptan.
Integer
. Yo estaba asombrado por la aceptó responder por Alibres, y por suerte ella respondió a mi pregunta que me llevó a este post: ¿Cómo se puede inicializar una Estructura con su valor predeterminado… 😉Debido a que una Estructura se compone de, posiblemente, varios Tipos diferentes (no un solo Tipo de valor, pero un posible compuesto de varios tipos diferentes), para preguntar si es «Nada» sería romper la lógica de la utilización de la «Nada». Nada de pruebas de forma diferente dependiendo del tipo de prueba y, por tanto, un tipo complejo no se adhiere a la lógica de la utilización de la «Nada». Sin embargo, para este tipo de pruebas, es decir, con una estructura que tiene todos sus miembros en sus respectivas «Nada» de los valores, se utiliza la función «IsNothing». Por ejemplo: