9

三項演算子にはタイプの混乱があるようです。これは他のSOスレッドで対処されていることは知っていますが、常にnull可能です。また、私の場合、私は本当にもっと良い方法を探しています。

使えるようになりたい

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

しかし、代わりに私はこれで立ち往生しています:

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

DBNullと文字列の間で変換が不可能なため、三項演算子は失敗します。Valueがオブジェクトであると考えると、それはばかげているように見えますが、コンパイラはそれを私にキックバックし、私は気にする必要があります。この質問のnull許容バージョンに対する答えは、nullを文字列にキャストしてそれで実行することです。ただし、DBNullを文字列にキャストすることはできないため、運がありません。

これを行うためのより簡潔な方法はありますか(ちなみに、nullablesを使用せずに)

ありがとう!

4

4 に答える 4

23

最初のステートメントを次のように変更できます。

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
于 2010-08-09T22:59:27.437 に答える
6

Valueプロパティはタイプであるため、 :ではなくobjectにキャストする必要があります。objectstring

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;
于 2010-08-09T22:59:06.647 に答える
6

または、次のような拡張メソッドを追加することもできます。

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

そして、あなたはただ言うことができます

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

Phil Haackから採用)

読みやすく簡潔ですよね?

于 2010-08-09T23:15:32.837 に答える
3

??を使用するのはどうですか?null合体演算子??に関する詳細 オペレーター

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
于 2014-10-23T17:13:47.087 に答える