2014-03-03 5 views
12

Wir alle wissen, dass VB Nothing ist ähnlich, aber nicht äquivalent zu C# null. (Wenn Sie nicht wissen, dass sind, haben einen Blick auf this answer zuerst.)Gibt es einen VB.NET-Ausdruck, der * immer * null ergibt?

Nur aus Neugier, ich möchte folgendes wissen:

Gibt es eine VB.NET Ausdruck, der immer liefert null?


ein konkretes Beispiel zu geben, nehmen Sie die folgende Erklärung ab:

Dim o As Object = If(myBool, 5, ...) 

Ist es möglich, ... mit etwas zu ersetzen, so dass o5 ist, wenn myBool wahr ist und Nothing/null wenn myBool falsch ist ?

Offensichtliche Lösungen, die nicht funktionieren:

  • Nothing (die Frage nach der verknüpften Antwort siehe oben),
  • DirectCast(Nothing, Object) (wirft einen Fehler bei der Kompilierung mit Option Strict On),
  • DirectCast(Nothing, Integer?) funktioniert für dieses Beispiel, funktioniert aber nicht im Allgemeinen (wenn Sie in diesem Beispiel 5 durch 5.0 ersetzen, müssen Sie die Besetzung ändern).

Offensichtliche Abhilfen (wird nicht als Antworten count):

  • Object eine Variable oder ein Feld Deklarieren, stellen auf Nothing und verwendet diesen für ...,
  • eine Methode oder Eigenschaft definieren, die immer gibt Nothing,
  • DirectCast den zweiten Parameter (5) zu Object zurück.

Hinweis: Das obige Beispiel ist nur ein Beispiel. Die Frage selbst ist fett geschrieben.

+0

Möchten Sie einen Einzeiler, der sowohl für Referenz- als auch für Werttypen verwendet werden kann? Was ist, wenn der Werttyp nicht nullfähig ist? Können Sie die _usage_ dieses Codes anzeigen? – CodeCaster

+3

Ihre Frage ist nicht so klar, warum müssen Sie immer 'null' bekommen? Was ist falsch daran, einen NULL-fähigen Typ anstelle eines Objekts zu verwenden? Wenn Ihr Beispiel \t austauschbar ist, stellen Sie ein besseres Beispiel zur Verfügung, wo 'Int32?' Keine Option ist. –

+0

@TimSchmelter: Ich kann mir vorstellen, dass sowas beim Schreiben eines automatisierten C# -> VB.NET Konverters nützlich sein könnte, aber hauptsächlich bin ich nur neugierig. Ich sehe nicht, wie die Frage unklar ist: "VB.NET-Ausdruck" ist wohldefiniert, und der gewünschte Rückgabewert des Ausdrucks ist in der Frage klar angegeben. – Heinzi

Antwort

13

Die erste Antwort gab ich ein paar Punkte verpasst, aber das sollte es tun:

Dim o As Object = If(myBool, 5, DirectCast(Nullable.GetUnderlyingType(GetType(Integer)), Object)) 

Dies nutzt die Tatsache, dass Nullable.GetUnderlyingType ein NULL-Verweis zurück, wenn Sie es sich um eine Art übergeben, der kein Nullable-Wert ist Typ - was Integer ist nicht. Andere Alternativen existieren, wie beispielsweise Type.GetElementType() oder vielleicht GetType(Object).BaseType.

Ich habe überprüft, dass dies mit mehreren verschiedenen Typen für den zweiten Operanden funktioniert.

Es ist etwas ärgerlich, dass Sie Object zu werfen ... Ich bin für die auf Alternativen noch arbeiten ...

+0

@ Heinzi: Ah - der Zweck dieses Punktes war nicht offensichtlich für mich (Das wäre sicherlich einfacher als all das Herumspielen.) –

+0

@Heinzi: Und tatsächlich funktioniert dieser Code * noch * wenn du ihn auf 5.0 änderst .. –

+0

@Heinzi: Ah - ich habe nicht Ignorieren Sie meinen vorherigen Kommentar :( –

7

Die einfache Antwort ist, nein. In VB.NET gibt es keinen Ausdruck, der nur null zurückgibt. Wie Sie wissen, wenn der Compiler einen Befehl unter Verwendung eines ternären Operators analysiert, leitet er den Ausgabetyp basierend auf den zwei Eingaben ab. Wenn einer der beiden Eingänge Nothing ist, muss er sich ausschließlich auf den anderen Parameter verlassen. Daher der "richtige" Weg, es in VB zu tun.NET ist es, zunächst die anderen Parameter zu Object gegossen, wodurch die Ausgabe des Betriebs zwingt ein zu Object:

Dim o As Object = If(myBool, DirectCast(5, Object), Nothing) 

Wenn Sie jedoch wirklich eine Inline-Ausdruck benötigen, der selbst ergibt immer null Sie konnte es immer durch einen Lambda-Ausdruck, wie dies Aufruf:

Dim o As Object = If(myBool, 5.0, (Function() Nothing).Invoke()) 

diese Syntax in jeder Situation funktionieren sollte und möglicherweise in Nothing eher immer führen würden als in Standardwert zur Folge hat.

+0

Wahr. Bitte beachten Sie jedoch Punkt 3 von "Offensichtliche Problemumgehungen (zählt nicht als Antworten)". – Heinzi

+0

Hoppla. Lesen Sie die Frage zu schnell Ich schätze :( –

+0

Ich aktualisierte meine Antwort auf eine andere, wenn auch hässliche, Lösung, die * Art von * erfüllt Ihre Kriterien. –

0

System.DBNull.Value ist höchstwahrscheinlich, was Sie wollen.

Expansion von Tech Republic:

... Der folgende C# -Code bestimmt, ob ein String-Wert ist null:

string sTest = "Test"; if (sTest == null) { Console.WriteLine("sTest is Null"); } 

Dieser Code ohne Probleme funktioniert mit C#, aber es gibt kein VB.NET-Äquivalent des Null-Schlüsselworts. Stattdessen verwendet VB.NET das Schlüsselwort Nothing. Der folgende Code demonstriert seine Verwendung:

Dim sTest As String 
If (sTest Is Nothing) Then 
    Console.WriteLine("sTest is Null") 
End If 

Ein weiterer Bereich, der Verwirrung ergibt sich aus der Tatsache, dass VB.NET behandeln nicht null und nichts als Gleichgestellte; Folglich muss ein VB.NET-Programmierer möglicherweise nach beiden Werten suchen.

Die Variation der Unterstützung kann zu Verwirrung führen, aber ein Entwickler entwickelt sich selten in beiden Sprachen gleichzeitig. Auf der anderen Seite bietet Microsoft eine einheitliche Methode für das Arbeiten mit Nullwerten: Der Basisnamensbereich System.Convert enthält das Objekt DBNull.

DBNull

Die Verwendung der DBNull Klasse zeigt das Fehlen eines bekannten Wert. Während die Microsoft-Dokumentation sagt, es ist in der Regel in einer Datenbank Anwendung, können Sie es auch mit jeder Art von Daten verwenden.

If (sTest.Equals(System.DBNull.Value) Then 
    Console.WriteLine("sTest is Null") 
End If 

- wörtlich aus Working with Null values in the .NET Framework

+1

'System.DBNull.Value IsNot Nothing'. – nmclean

0

können Sie erstellen selbst eine Beurteilung (einen anderen Namen für die Funktion wählen, wenn Sie mögen):

Private Function ValueOrNull(expression As Boolean, value As Object) As Object 
    If expression Then Return value 
    Return Nothing 
End Function 

Verbrauch:

Dim myBool As Boolean 
Dim o As Object = ValueOrNull(myBool, 5) 

Funktioniert mit jedem Typ, einschließlich Ihres Beispiels mit 5.0.

Verwandte Themen