Вопрос

Я наткнулся на это, и мне было интересно, может ли кто-нибудь объяснить, почему это работает в VB.NET когда я ожидал бы, что это должно завершиться неудачей, точно так же, как это происходит в 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

Но затем в VB.NET...

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

Разве Ничто не совпадает с null (Ничего != null - ЛОЛ?), или это просто разные способы решения одной и той же ситуации между двумя языками?

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

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

Учитывая некоторые комментарии, я еще немного повозился с этим...кажется, что вам действительно нужно использовать 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'

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Итак...возражать?

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

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

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