С# vs VB.NET - Обработка нулевых структур

Я столкнулся с этим и задавался вопросом, может ли кто-нибудь объяснить, почему это работает в 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?

Является ли что-то не то же самое, что и null (Nothing!= null - LOL?), или это просто разные способы обработки одной и той же ситуации между двумя языками?

Почему или что обрабатывается по-разному между двумя, что делает это хорошо в одном, но не в другом?

[Обновление]

Учитывая некоторые из комментариев, я испортил это немного больше... кажется, что вам действительно нужно использовать Nullable, если вы хотите разрешить что-то быть нулевым в VB.NET... так, например...

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

Слишком странно...

Ответ 1

Если я правильно помню, "Nothing" в VB означает "значение по умолчанию". Для типа значения это значение по умолчанию для ссылочного типа должно быть нулевым. Таким образом, не присваивая ничего структуре, это не проблема.

Ответ 2

Nothing примерно эквивалентен default(T) для соответствующего типа. (Только что проверено, и это верно и для строк, т.е. Nothing является пустой ссылкой в ​​контексте строк.)

Ответ 3

Я попытался найти его в MSDN, но не смог найти что-либо релевантное на стороне VB. При поиске "struct" на С# он явно возвращает, что это Тип значения и не может быть назначен null, поскольку... это значение.

Однако при просмотре ключевого слова VB.NET "Структура" он не говорит "Тип значения". Вместо этого он говорит

Оператор Structure определяет тип составного значения, который вы можете настроить.

Итак... объект?

Это было бы моим догадком. Я хотел бы иметь ссылки на это поведение, но не смог найти.

Ответ 4

Кроме того, структуры представляют собой типы значений (как и int, char и т.д.) и, следовательно, не являются нулевыми.

Ответ 5

Поскольку структура состоит из, возможно, нескольких разных типов (а не одного значения Тип, но возможного композита из нескольких разных типов), чтобы спросить, является ли это "Ничто", нарушит логику использования "Ничего", Ничто не тестируется по-разному в зависимости от типа, который вы тестируете, и поэтому сложный тип не придерживается логики использования "Ничего". Однако для такого типа тестирования, то есть со структурой, имеющей все ее компоненты, в их соответствующих значениях "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