Подтвердить что ты не робот

Значение по умолчанию для дженериков

Как создать значение по умолчанию для общего в VB? в С# я могу позвонить:

T variable = default(T);
  • Как это сделать в VB?
  • Если это просто возвращает null (С#) или ничего (vb), то что происходит со значениями типов?
  • Можно ли указать для настраиваемого типа значение по умолчанию? Например, если я хочу, чтобы значение по умолчанию было эквивалентным вызову конструктора без параметров в моем классе.
4b9b3361

Ответ 1

Вопрос 1:

Dim variable As T
' or '
Dim variable As T = Nothing
' or '
Dim variable As New T()

Обратите внимание, что последнее работает, только если вы указали ограничение Structure для общего типа (для ссылочных типов New T() в VB делает что-то еще, чем default(T) в С#).

Вопрос 2:

Для типов значений все члены структуры "заглушены", т.е. все элементы ссылочного типа имеют значение null (Nothing), и все типы значений в свою очередь отключаются.

И нет, поскольку string является ссылочным типом, это не приводит к "" для строк, как предложено в другом ответе.

Вопрос 3:

Нет, нет способа указать это. Есть несколько потоков об этом в Qaru уже, например. здесь. Джон опубликовал отличное объяснение, почему это так.

Ответ 2

Собственно, правильный способ сделать это - применить тип null (Nothing) как ваш общий тип следующим образом:

Dim tmpObj As T = CType(Nothing, T)

Если вы хотите вернуть значение по умолчанию для общего типа, просто верните CType(Nothing, T)

Ответ 3

На самом деле я не был парнем VB, я допустил некоторые ошибки в своем первоначальном ответе, что Конрад поставил меня прямо. Первоначальный ответ приведен ниже, но я хотел обновить свой ответ, чтобы быть правильным на основе ввода Konrad.

Как говорит Конрад, default(T) и Nothing на самом деле эквивалентны как для значений, так и для ссылочных типов. Правильный код VB должен быть следующим: в этом случае вы получите то же самое поведение, что и в моем коде С#:

Function ReturnSomething(Of T)() As T
    Return Nothing
End Function

Function DoSomething(Of T)()
    Dim x as T = Nothing;
    If x = Nothing Then
        Console.WriteLine("x is default.")
    Else
        Console.WriteLine("x has a value.")
    End If

Ответ на оригинал (WRONG)

Похоже, что VB не эквивалентен default(T). Однако в соответствии с этот пост, в отличие от С#, если T - тип значения, в VB вы все равно можете использовать Nothing, который семантически то же самое в большинстве случаев.

Большое место, где у вас возникнет проблема с использованием Nothing, где вы обычно используете default(T), - это если вам нужно проверить его внутри вашего кода. Рассмотрим следующий код С#:

T ReturnSomething<T>()
{
    return default(T);
}

void DoSomething<T>()
{
    T x = default(T);
    if(x == default(T))
        Console.WriteLine("x is default.");
    else
        Console.WriteLine("x has a value.");
}

Переведено на VB следующим образом:

Function ReturnSomething(Of T)() As T
    Return Nothing
End Function

Function DoSomething(Of T)()
    Dim x as T = Nothing;
    If x Is Nothing Then
        Console.WriteLine("x is default.")
    Else
        Console.WriteLine("x has a value.")
    End If
End Function

Если T является ссылочным типом, обе версии будут действовать одинаково для обоих ReturnSomething и DoSomething. Однако, если T - тип значения, ReturnSomething будет действовать точно так же для любого языка, но DoSomething будет печатать "x по умолчанию". в версии С#, но "x имеет значение". в версии VB.