3

私のデータベースでは、v1 フィールドは null 許容フィールドです。ただし、値が null の場合は 0 (デフォルト) を定義します。

public decimal? v1 {
  get {
    return this._v1; 
  }
  set {
    this._v1 = value ?? 0M;
  }
}

そのため、v1 は null 許容変数ではなくなりました。

しかし、私はこれを行うことはできません、

decimal v2 = v1;

エラー メッセージには、型 'decimal を暗黙的に変換できませんか?' と表示されます。「10進数」に。

この場合、このように 10 進数に変換する必要がありますか?

decimal v2 = Convert.ToDecimal(v1);

とても面倒くさい仕事です。コードも汚く見えます。

誰もがより良い解決策を知っていますか? 私にアドバイスしてください。

4

5 に答える 5

18

いいえ、変換する必要はありません。型decimal?から基になる値にアクセスできます。Nullable

decimal v2 = v1.Value;

型にデフォルト値を割り当てても、Nullablenull 非許容にはなりません。値があることを意味するだけです。Null 許容型には、HasValueこれを判断するのに役立つプロパティがあります。

記録のために、値をデフォルトにすることはお勧めしません。おそらく、実際にnullになる可能性があることを考慮し0てデフォルトにする方が理にかなっています。アプリにデフォルト値が必要な場合は、おそらく次のメソッドを使用する必要があります。nullGetValueOrDefault

decimal v2 = v1.GetValueOrDefault(0m);
于 2012-09-18T15:22:03.797 に答える
8

に変換する最も簡単な方法ですが、の値decimal?decimal持っている0場合は、次のようnullに実行できます。

decimal? a = null;
decimal b = a.GetValueOrDefault(0m); // will contain 0 when null, otherwise the value

GetValueOrDefaultを読んでください

GetValueOrDefault引数なしで呼び出すこともできます。これdefault(T)により、Decimalの場合は0になりますが、明示的にするのが好きです。

于 2012-09-18T15:24:52.813 に答える
5

アプリ コード変数を null 許容として定義し、null の場合は 0 に設定する理由が知りたいです。データベースからアプリ変数に null 値を渡す場合に例外を回避するだけですか? アプリケーションが null 許容の 10 進変数を絶対に必要としない場合は、読み取り時に DbNull をチェックしてください。

decimal myAppVal = rdr["DbColumn"] == DBNull.Value 
   ? default(decimal) 
   : (decimal) rdr["DbColumn"];

または default(decimal) を使用する代わりに明示的に 0.0M を設定します

設計上、これを頻繁に行う場合は、データベースから値を読み取るための汎用拡張メソッドを作成することをお勧めします。このようにして、無効なキャストが回避され、例外が処理されるようにすることができますが、さらに重要なことは、null の場合にデフォルト値が返されることです。;)

次のようなものです(そして、私はここで唾を吐きます):

public static T CastFromDbTo<T>(object readerObject)
{
    T returnVal = default(T);
    if (readerObject is T)
    {
        var myValue = (T) readerObject;
        returnVal = readerObject != DbNull.Value && myValue != null
                ? (T) readerObject 
                : default(T);
    }
    return returnVal;
}

次に、次のように値を取得できます。

var myAppValue = HelperClass.CastFromDbTo<decimal>(rdr["DbColumn"]);

または実際に拡張機能を作成します。

public static T CastFromDbTo<T>(this object readerObject)
{
    T returnVal = default(T);
    if (readerObject is T)
    {
        var myValue = (T) readerObject;
        returnVal = readerObject != DbNull.Value && myValue != null
                ? (T) readerObject 
                : default(T);
    }
    return returnVal;
}

次に、これを行うことができます:

var myAppVal = rdr["DbColumn"].CastFromDbTo<decimal>();
于 2012-09-18T15:59:13.517 に答える
1

Nullable 型にはプロパティValueとがありHasValueます。

HasValue - 現在の Nullable オブジェクトに値があるかどうかを示す値を取得します。

Value - HasValue が true の場合、null でない場合は値が含まれます。

decimal v2;

if (v1.HasValue) // check for null
{
  v2 = v1.Value;
}

MSDNを確認してください- Nullable 型 (C# プログラミング ガイド)

于 2012-09-18T15:23:32.863 に答える
1

v1 に割り当てた値は ですdecimalが、タイプはまだdecimal?です。それがあなたがそれを評価できない理由です。

試す

decimal v2 = v1.Value;
于 2012-09-18T15:22:37.513 に答える