C#类型后缀为十进制

我不知道我正在努力实现的正确措辞是什么,所以它可能已经在网上发布。 如果是,请善待。

好吧基本上我有这个方法。

public static T IsNull(IDataReader dr, String name, T nullValue) { return Helpers.IsNull(dr, dr.GetOrdinal(name), nullValue); } public static T IsNull(IDataReader dr, Int32 index, T nullValue) { if (dr.IsDBNull(index)) { return nullValue; } else { return (T)dr.GetValue(index); } } 

被称为Helpers.IsNull(dr, "UnitWholeSale", 0d) ,我得到的错误是“无法从double转换为十进制”。

现在我知道我可以使用decimal.Zero但有一些方法我可以简单地去0dec或类似的东西吗? 我只是讨厌那些冗长的快捷方式值(特别是在调用带有20个参数的构造函数时)。

0m是你怎么说(decimal)0因为m是后缀,意思是decimal

其他后缀为f表示floatd表示doubleu表示unsignedl表示long 。 它们可以是大写或小写,并且可以与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; 

请注意,每个最后一个示例都是强制转换,因此可能会失去精度

Mdecimal值的后缀,例如200.32M被认为是编译器的decimal类型。

您可以使用0m作为十进制值,而不是使用0d

我假设nullValue确实是defaultvalue ,否则你可以这样做

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

另外仔细查看你的方法你可能想要一个可转换的值并使用Convert.ChangeType() ,我不认为简单的转换会适用于所有类型:

 public static T IsNull(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