2010-02-08 3 views
6

Jetzt, als C# -Programmierer, weiß ich, dass Generika genial sind. Wenn jedoch in einigen VB.NET Dilettantismus, entdeckte ich, dass die folgenden nicht einen Compiler-Fehler verursacht:Generics in VB.NET

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

Warum ist das? Ich weiß, dass Sie nicht in VB.NET einwerfen müssen, aber ich hätte gedacht, dass dies den Hauptgrund für die Verwendung von Generika - Typ Sicherheit - tötet.

Bearbeiten: Ich habe keine Option streng auf, da dies keine echte Programmierung Übung war, nur ich einen Blick auf VB.NET in der Theorie. Es ist eine theoretische Frage, da ich erwartet habe, dass es sogar mit der Option strict off einen Compilerfehler verursacht, genauso wie ein Merkmal generischer Typen.

Antwort

10

Ohne Option Strict On konvertiert VB.NET implizit in Integer. Ich empfehle dringend (vor allem aus einem C# -Hintergrund), dass Sie Option Strict On den Standard für Ihre VB.NET-Arbeit machen.

Sie können dies in Visual Studio in Tools | tun Options | Projects and Solutions | VB Defaults.

bearbeiten für mehr auf die VB (klassisch) 'entspannte' Einstellung zur Typumwandlung, google 'Evil Type Zwang'. Diejenigen von uns, die gute Arbeit in VB (klassisch) tun wollten, mussten diesen Dämon wrestlen, während ...

+1

+1 Hier ist die originale und beste Kritik an Bösartigkeitszwang in VB, geschrieben im Jahr 1995, als es eingeführt wurde, und noch heute relevant. http://vb.mvps.org/articles/pt199511.pdf – MarkJ

0

VB.NET konvertiert an der Funktionsaufrufseite. Die Liste (von Integer) speichert immer noch eine ganze Zahl (-1, die der ganzzahlige Wert von True ist)

+0

Wer mit der Idee kam, einen _positive_ Wahrheitswert mit einem _negative_ numerischen Wert darzustellen, sollte seinen Kopf untersuchen lassen. – Rik

+0

@Rik ... -1 ist alle Bits hoch. False ist 0, weil alle Bits ausgeschaltet sind. –

+0

@Matthew Whited: Zugegeben, das macht Sinn. Dennoch mag ich die 0/1-Konvention viel besser. – Rik