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

голоса
18

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

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


3 ответов

голоса
23

Вопрос 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:

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

Ответил 09/12/2008 в 21:34
источник пользователем

голоса
5

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

Dim tmpObj As T = CType(Nothing, T)

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

Ответил 18/12/2009 в 17:14
источник пользователем

голоса
0

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

Как говорит Конрад, 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

Original (НЕПРАВИЛЬНО) Ответ

Похоже , что нет 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.");
}

В переводе В. Б., как это:

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

Ответил 09/12/2008 в 22:12
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more