Valor predeterminado para genéricos

votos
18

¿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.
Publicado el 09/12/2008 a las 21:32
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
23

Pregunta 1:

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

Observe que este último solo funciona si especifica la Structurerestricción para el tipo genérico (para los tipos de referencia, New T()en VB hace algo más que 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 stringes un tipo de referencia, no da como resultado ""cadenas, como se sugiere en la otra respuesta.

Pregunta 3:

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

Respondida el 09/12/2008 a las 21:34
fuente por usuario

votos
5

En realidad, la gente la manera correcta de hacerlo es a emitir el null( Nothing) de tipo ya que su tipo genérico de la siguiente manera:

Dim tmpObj As T = CType(Nothing, T)

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

Respondida el 18/12/2009 a las 17:14
fuente por usuario

votos
0

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, default(T)y Nothingde hecho son equivalentes para ambos 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 default(T). Sin embargo, de acuerdo con esta publicación , a diferencia de C #, si Tes un tipo de valor, en VB todavía puede usar Nothingque es semánticamente el mismo en la mayoría de los casos.

El gran lugar donde tendrías un problema al usar Nothingdonde 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 Tes un tipo de referencia, ambas versiones actuarán exactamente igual para ambos ReturnSomethingy DoSomething. Sin embargo, si Tes un tipo de valor, ReturnSomethingactuará exactamente igual para cualquier idioma, pero DoSomethingimprimirá "x es el predeterminado". en la versión C #, pero "x tiene un valor". en la versión VB.

Respondida el 09/12/2008 a las 22:12
fuente por usuario

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