variable type multiple method generic c# .net vb.net generics

type - generic variable c#



Valor predeterminado para genéricos (3)

¿Cómo creo el valor predeterminado para un genérico en VB? en C # puedo llamar:

T variable = default(T);

  1. ¿Cómo hago esto en VB?
  2. Si esto simplemente devuelve nulo (C #) o nada (vb), entonces, ¿qué ocurre con los tipos de valores?
  3. ¿Hay alguna manera de especificar para un tipo personalizado cuál es el valor predeterminado? Por ejemplo, qué pasa si quiero que el valor predeterminado sea el equivalente a llamar a un constructor sin parámetros en mi clase.

No siendo realmente un tipo VB, cometí algunos errores en mi respuesta original de que Konrad me puso directamente. La respuesta original está a continuación, pero quería actualizar mi respuesta para que sea correcta en función de la información de Konrad.

Como dice Konrad, el default(T) y Nothing son, de hecho, equivalentes para los tipos de valor y referencia. El código VB correcto debería ser el siguiente, en cuyo caso obtendrías exactamente el mismo comportamiento que obtienes en mi código 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 (INCORRECTO) Respuesta

Parece que no hay VB equivalente a la default(T) . Sin embargo, de acuerdo con esta publicación , a diferencia de C #, si T es un tipo de valor, en VB aún puede usar Nothing que es semánticamente el mismo en la mayoría de los casos.

El gran lugar donde tendrías un problema al usar Nothing donde normalmente usarías default(T) es si necesitas probarlo dentro de tu código. Considere el siguiente código de 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."); }

Traducido a VB como este:

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

Si T es un tipo de referencia, ambas versiones actuarán exactamente igual para ReturnSomething y DoSomething . Sin embargo, si T es un tipo de valor, ReturnSomething actuará exactamente igual para cualquier idioma, pero DoSomething imprimirá "x es el predeterminado". en la versión C #, pero "x tiene un valor". en la versión VB.


En realidad, la forma correcta de hacer esto es convertir el tipo null ( Nothing ) como tu tipo genérico de la siguiente manera:

Dim tmpObj As T = CType(Nothing, T)

Si desea devolver el valor predeterminado para el genérico, simplemente devuelva CType(Nothing, T)


Pregunta 1:

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

Tenga en cuenta que este último solo funciona si especifica la restricción de Structure para el tipo genérico (para los tipos de referencia, New T() en VB hace algo distinto de lo default(T) en C #).

Pregunta 2:

Para los tipos de valor, todos los miembros de la estructura están anulados, es decir, todos los miembros del tipo de referencia están configurados como null ( Nothing ) y todos los tipos de valores a su vez están anulados.

Y no, dado que string es un tipo de referencia, no da como resultado "" para cadenas como se sugiere en la otra respuesta.

Pregunta 3:

No, no hay forma de especificar esto. Ya hay algunos hilos sobre esto en , por ejemplo aquí . Jon ha publicado una excelente explicación de por qué es esto.