Значение по умолчанию для дженериков - PullRequest
18 голосов
/ 09 декабря 2008

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

T variable = default(T);
  1. Как мне это сделать в VB?
  2. Если это просто возвращает ноль (C #) или ничего (vb), то что происходит с типами значений?
  3. Есть ли способ указать для пользовательского типа значение по умолчанию? Например, что если я хочу, чтобы значение по умолчанию было эквивалентно вызову конструктора без параметров в моем классе.

Ответы [ 3 ]

23 голосов
/ 09 декабря 2008

Вопрос 1:

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

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

Вопрос 2:

Для типов значений все члены структуры «обнуляются», т. Е. Все члены ссылочного типа установлены на null (Nothing), а все типы значений в свою очередь обнуляются.

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

Вопрос 3:

Нет, это невозможно указать. В Stack Overflow уже есть некоторые темы, например, здесь . Джон опубликовал превосходное объяснение почему это так.

5 голосов
/ 18 декабря 2009

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

Dim tmpObj As T = CType(Nothing, T)

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

0 голосов
/ 10 декабря 2008

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

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

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

Оригинальный (НЕПРАВИЛЬНЫЙ) Ответ

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

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

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 по умолчанию». в версии C #, но «х имеет значение». в версии VB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...