Frage

Es scheint, dass es eine Art Verwirrung in dem ternären Operator. Ich weiß, dass dies in anderen SO Themen angesprochen worden, aber es ist immer mit nullables gewesen. Auch für meinen Fall bin ich wirklich nur auf der Suche nach einem besseren Weg.

Ich möchte Verwendung der Lage sein,

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;

, sondern bin ich mit diesem fest:

if (string.IsNullOrEmpty(dest.Id))
{
    proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
    proc.Parameters[PARAM_ID].Value = dest.Id;
} 

Der ternäre Operator schlägt fehl, da es keine Konvertierung möglich zwischen DBNull und Schnur, und so dumm wie das scheint angesichts Wert des Objekts ist der Compiler Kicks es mir zurück, und ich bin zu Pflege gezwungen. Die Antwort auf die Nullable-Version dieser Frage ist nur null String gegossen und mit ihm getan werden; DBNull kann nicht auf Zeichenfolge gegossen werden, obwohl, so kein Glück gibt.

Gibt es eine prägnante Art und Weise, dies zu tun (ohne nullables zu verwenden, übrigens?)

Danke!

War es hilfreich?

Lösung

Sie können Ihre erste Aussage ändern:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;

Andere Tipps

Die Value Eigenschaft ist vom Typ object, so dass Sie object werfen sollten, nicht string:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;

Oder Sie könnten eine Erweiterungsmethode hinzufügen, wie zum Beispiel:

public static class DBNullExtensions
{
    public static object AsDBNullIfEmpty(this string value)
    {
        if (String.IsNullOrEmpty(value))
        {
            return DBNull.Value;
        }
        return value;
    }
}

Und dann könnte man einfach sagen:

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();

(Angepasst von Phil Haack )

Lesbare und prägnant, nicht wahr?

Was ist die Verwendung von ?? Null-Koaleszenz Operator Mehr Details über ?? Operator

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top