2010-02-08 10 views
6

Ahora, como un programador de C#, sé que los genéricos son impresionantes. Sin embargo, cuando incursionando en algunos VB.NET, he descubierto que el siguiente no se produce un error de compilación:genéricos en VB.NET

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

¿Por qué es esto? Sé que no se requiere que participes de VB.NET, pero pensé que esto mata la razón principal para usar la seguridad de tipo genérico.

Edición: No tengo la opción de estricta, ya que este no fue un ejercicio de programación real, solo que eché un vistazo a VB.NET en teoría. Es una pregunta teórica, ya que esperaba que causara un error de compilación incluso con la opción strict off, solo como una característica de los tipos genéricos.

Respuesta

10

Sin Option Strict On, VB.NET se complace en convertir implícitamente Boolean en Integer. Recomiendo encarecidamente (especialmente desde un entorno de C#) que establezca Option Strict On como el valor predeterminado para su trabajo de VB.NET.

Usted puede hacer esto en Visual Studio en Tools | Options | Projects and Solutions | VB Defaults.

edita para obtener más información sobre la actitud "relajada" de VB (clásica) a la conversión de tipo, google 'Evil Type Coercion'. Aquellos de nosotros que trató de hacer un buen trabajo en VB (clásico) tuvo que luchar con este demonio de tiempo ...

+1

1 Aquí está la crítica original y mejor de la coacción de tipo maligno en VB, escrito en 1995, cuando se presentó, y sigue siendo relevante hoy. http://vb.mvps.org/articles/pt199511.pdf – MarkJ

0

VB.NET convierte en el lugar de llamada a la función. La lista (de entero) todavía está almacenando un número entero (-1, que es el valor entero de la Verdadera)

+0

El que vino con la idea de representar un valor de verdad _positive_ con un valor numérico _negative_ debe hacerse examinar la cabeza. – Rik

+0

@Rik ... -1 es todo alto. False es 0 porque todos los bits están desactivados. –

+0

@Matthew Whited: Es cierto que tiene sentido. Aún así, me gusta mucho más la convención 0/1. – Rik