Pergunta

Eu corri em toda esta e queria saber se alguém poderia explicar por que isso funciona em VB.NET quando eu esperaria que ele deve falhar, assim como ele faz em 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

Mas, em seguida, em VB.NET ...

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

não é nada não é o mesmo como nula ( Nada = null -!? LOL)? , ou é apenas diferentes maneiras de lidar com a mesma situação entre as duas línguas

Por que ou o que é tratado de forma diferente entre os dois que torna este bem em um, mas não o outro?

[Update]

Dado alguns dos comentários, eu errei com isso um pouco mais ... parece que você realmente tem que usar Nullable se você quiser permitir que algo a ser nula em VB.NET ... assim, por exemplo .. .

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

Muito estranho ...

Foi útil?

Solução

Se bem me lembro, 'nada' em meio VB "o valor padrão". Para um tipo de valor, que é o valor padrão para um tipo de referência, que seria nula. Assim, a atribuição de nada para um struct, não é nenhum problema em tudo.

Outras dicas

Nothing é aproximadamente equivalente a default(T) para o tipo relevante. (Basta verificar, e isso é verdade para cordas, bem como -. Ou seja Nothing é uma referência nula no contexto de strings)

Eu tentei procurar por ele no MSDN, mas não consegui encontrar nada relevante no lado do VB. Ao procurar por "struct" em C #, claramente retornos que é um tipo de valor e não podem ser atribuídos nula uma vez ... é um valor.

No entanto, quando se olha em VB.NET palavra-chave "Estrutura" não diz "Valor Tipo". Em vez disso, diz

A declaração Estrutura define um tipo composto valor que você puder customize.

Então ... objeto?

Isso seria o meu palpite. Eu gostaria de ter referências a este comportamento, mas não conseguiu encontrar nenhum.

Além disso, estruturas são tipos de valor (bem como int, carvão animal, etc.) e, portanto, são não-nulo.

Porque uma estrutura é composta de, possivelmente, vários tipos diferentes (nem um único valor Tipo, mas um possível composto de diversos tipos diferentes), para perguntar se ele é "Nothing" iria quebrar a lógica do uso de um "Nada" . testes nada diferente, dependendo do tipo que você está testando e, portanto, um tipo complexo não adere à lógica do uso de um "Nada". No entanto, para este tipo de teste, isto é, com uma estrutura com todos os seus membros componentes os seus respectivos valores de "nada", que utilizam a função de "IsNothing". Por exemplo:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top