Значение по умолчанию для дженериков
Как создать значение по умолчанию для общего в VB? в С# я могу позвонить:
T variable = default(T);
- Как это сделать в VB?
- Если это просто возвращает null (С#) или ничего (vb), то что происходит со значениями типов?
- Можно ли указать для настраиваемого типа значение по умолчанию? Например, если я хочу, чтобы значение по умолчанию было эквивалентным вызову конструктора без параметров в моем классе.
Ответы
Ответ 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.