私が達成しようとしていることの正しい表現が何であるかわからないので、すでにオンラインで投稿されている可能性があります。よろしければご了承ください。
わかりましたので、基本的に私はこの方法を持っています。
_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個のパラメーターを持つコンストラクターを呼び出す場合)。
0m
はあなたの言い方です(decimal)0
は、m
がdecimal
を意味するサフィックスであるためです。
その他のサフィックスは、f
のfloat
、d
のdouble
、u
のunsigned
、およびl
for long
。大文字でも小文字でもかまいませんが、u
をl
と組み合わせてulong
にすることができます。
サフィックスでは大文字と小文字が区別されませんが、C#言語仕様のセクション2.4.4.2での説明に留意してください。
スタイルの問題として、longタイプのリテラルを書くときは、「l」の代わりに「L」を使用することをお勧めします。これは、文字「l」と数字の「1」を混同しやすいためです。
0m
は、decimal
0の値を提供します。
完全を期すために
0.0 - double
0f - float
0m - decimal
float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;
最後の例はキャストであるため、精度が低下する可能性があることに注意してください
M
はdecimal
値のサフィックスです。たとえば、 200.32M
は、コンパイラに対してdecimal
タイプであると見なされます。
0d
を使用する代わりに、10進値に0m
を使用できます。
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));
}
}
_
使用する 0.0m
代わりに-m
はdecimal
を示します。