2010-02-08 5 views
6

Ora, come programmatore C#, so che i farmaci generici sono fantastici. Tuttavia, quando dilettarsi in qualche VB.NET, ho scoperto che il seguente non causa un errore di compilazione:Generics in VB.NET

Dim instance As List(Of Integer) 
instance.Add(True) 

Perché è questo? So che non è necessario eseguire il cast in VB.NET, ma avrei pensato che questo uccidesse il motivo principale per usare i generici - digitare safety.

Modifica: Non ho l'opzione strict on, in quanto non si trattava di un vero esercizio di programmazione, solo di aver dato un'occhiata a VB.NET in teoria. È una domanda teorica, poiché mi aspettavo che causasse un errore del compilatore anche con l'opzione strict off, proprio come una caratteristica dei tipi generici.

risposta

10

Senza Option Strict On, VB.NET è felice di convertire implicitamente Boolean in Integer. Consiglio vivamente (soprattutto se proviene da uno sfondo in C#) che tu crei Option Strict On come predefinito per il tuo lavoro su VB.NET.

È possibile farlo in Visual Studio in Tools | Options | Projects and Solutions | VB Defaults.

modifica per ulteriori informazioni sull'atteggiamento "rilassato" VB (classico) alla conversione del tipo, google "Evil Type Coercion". Quelli di noi che hanno cercato di fare un buon lavoro in VB (classico) hanno dovuto lottare con questo demone mentre ...

+1

+1 Ecco la critica originale e migliore della coercizione di tipo malvagio in VB, scritta nel 1995 quando fu introdotta, e ancora rilevante oggi. http://vb.mvps.org/articles/pt199511.pdf – MarkJ

0

VB.NET si converte nel sito di chiamata di funzione. La List (di Integer) sta ancora memorizzando un intero (-1, che è il valore intero di True)

+0

Chiunque venisse con l'idea di rappresentare un valore di verità _positive_ con un valore numerico_n_nativo dovrebbe avere la sua testa esaminata. – Rik

+0

@Rik ... -1 è alto tutti i bit. False è 0 perché tutti i bit sono disattivati. –

+0

@ Matthew Whited: Certamente, questo ha un senso. Comunque, mi piace molto la convenzione 0/1. – Rik