O valor padrão para os genéricos

votos
18

Como faço para criar o padrão para um genérico em VB? em C # eu pode ligar no:

T variable = default(T);
  1. Como posso fazer isso em VB?
  2. Se isto apenas retorna null (C #) ou nada (vb), então o que acontece com tipos de valor?
  3. Existe uma maneira de especificar para um tipo personalizado que o valor padrão é? Por exemplo, o que se eu quiser o valor padrão a ser o equivalente a chamar um construtor sem parâmetros na minha classe.
Publicado 09/12/2008 em 21:32
fonte usuário
Em outras línguas...                            


3 respostas

votos
23

Questão 1:

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

Observe que este último só funciona se você especificar a Structurerestrição para o tipo genérico (para tipos de referência, New T()em VB faz outra coisa do que default(T)em C #).

Questão 2:

Para tipos de valor todos os membros da estrutura são “anulado” para fora, ou seja, todos os membros tipo de referência são definidos para null( Nothing) e todos os tipos de valor são, por sua vez nulled fora.

E não, já que stringé um tipo de referência, isso não resultará em ""para cordas, tal como sugerido na outra resposta.

Questão 3:

Não, não há nenhuma maneira de especificar isso. Existem alguns tópicos sobre isso na Stack Overflow já, por exemplo, aqui . Jon postou uma excelente explicação por que isso é.

Respondeu 09/12/2008 em 21:34
fonte usuário

votos
5

Na verdade as pessoas a maneira correta de fazer isso é lançar o null( Nothing) tipo como o tipo genérico da seguinte forma:

Dim tmpObj As T = CType(Nothing, T)

Se você quiser retornar o valor padrão para o genérico você simplesmente voltar CType(Nothing, T)

Respondeu 18/12/2009 em 17:14
fonte usuário

votos
0

Não sendo realmente um cara VB, eu cometi alguns erros na minha resposta original que Konrad me colocou em frente. A resposta inicial é baixo, mas eu queria atualizar a minha resposta para ser correto com base na entrada de Konrad.

Como Konrad diz, default(T)e Nothingsão, de facto equivalente para ambos os tipos de valor e de referência. O código VB correta deve ser da seguinte forma, caso em que você teria o mesmo comportamento exato que você entrar no meu 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 (ERRADO) Resposta

Parece que não há nenhuma VB equivalente a default(T). No entanto de acordo com este post , ao contrário de C #, se Té um tipo de valor, em VB você ainda pode usar Nothingo que é semanticamente o mesmo na maioria dos casos.

A grande lugar onde você teria um problema usando Nothingonde você usaria normalmente default(T)é se você precisa testar para ele dentro do seu código. Considere o seguinte código 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.");
}

Traduzido para VB assim:

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

Se Té um tipo de referência, ambas as versões agirá exatamente o mesmo para ambos ReturnSomethinge DoSomething. No entanto, se Té um tipo de valor, ReturnSomethingvai agir exatamente o mesmo para qualquer idioma, mas DoSomethingirá imprimir "x é padrão." na versão C #, mas "x tem um valor." na versão VB.

Respondeu 09/12/2008 em 22:12
fonte usuário

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