web-dev-qa-db-ja.com

10進数のC#型サフィックス

私が達成しようとしていることの正しい表現が何であるかわからないので、すでにオンラインで投稿されている可能性があります。よろしければご了承ください。

わかりましたので、基本的に私はこの方法を持っています。

_public static T IsNull<T>(IDataReader dr, String name, T nullValue)
{
    return Helpers.IsNull(dr, dr.GetOrdinal(name), nullValue);
}

public static T IsNull<T>(IDataReader dr, Int32 index, T nullValue)
{
    if (dr.IsDBNull(index))
    {
        return nullValue;
    }
    else
    {
        return (T)dr.GetValue(index);
    }
}
_

Helpers.IsNull(dr, "UnitWholeSale", 0d)として呼び出され、「ダブルから10進数に変換できません」というエラーが表示されます。

_decimal.Zero_を使用できることがわかったのですが、0decまたはそれに類似したものを使用する方法はありますか?私はそれらの長いショートカット値が嫌いです(特に、20個のパラメーターを持つコンストラクターを呼び出す場合)。

33

0mはあなたの言い方です(decimal)0は、mdecimalを意味するサフィックスであるためです。

その他のサフィックスは、ffloatddoubleuunsigned、およびl for long。大文字でも小文字でもかまいませんが、ulと組み合わせてulongにすることができます。

サフィックスでは大文字と小文字が区別されませんが、C#言語仕様のセクション2.4.4.2での説明に留意してください。

スタイルの問題として、longタイプのリテラルを書くときは、「l」の代わりに「L」を使用することをお勧めします。これは、文字「l」と数字の「1」を混同しやすいためです。

70
Gabe

0mは、decimal 0の値を提供します。

完全を期すために

0.0 - double
0f  - float
0m  - decimal
15
Adam Robinson
float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;

最後の例はキャストであるため、精度が低下する可能性があることに注意してください

3
jh.edens

Mdecimal値のサフィックスです。たとえば、 200.32Mは、コンパイラに対してdecimalタイプであると見なされます。

1
user153498

0dを使用する代わりに、10進値に0mを使用できます。

1
Reed Copsey

nullValueは本当にdefaultvalueだと思いますが、それ以外の場合は、

_public static T IsNull<T>(IDataReader dr, Int32 index)
{
    if (dr.IsDBNull(index))
    {
        return default(T);
    }
    else
    {
        return (T)dr.GetValue(index);
    }
}
_

また、あなたのメソッドをより詳しく見て、おそらく変換可能な値が必要であり、 Convert.ChangeType() を使用します、私はしません単純なキャストがすべてのタイプで機能するとは考えていません。

_public static T IsNull<T>(IDataReader dr, Int32 index) where T: IConvertible 
{
    if (dr.IsDBNull(index))
    {
        return default(T);
    }
    else
    {
        return (T)Convert.ChangeType(dr.GetValue(index), typeof(T));
    }
}
_
1
BrokenGlass

使用する 0.0m代わりに-mdecimalを示します。

0
Daniel A. White