C#类型后缀为十进制

时间:2011-03-17 00:37:36

标签: c# types double decimal type-inference

我不知道我想要达到的目的是什么正确的措辞所以它可能已经在网上发布。如果是,请善待。

好的,基本上我有这个方法。

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),我得到的错误是“无法从双精度转换为十进制”。

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

7 个答案:

答案 0 :(得分:67)

0m就是您所说的(decimal)0,因为m是后缀,表示decimal

其他后缀为f floatddoubleuunsignedllong。 {1}}。它们可以是大写也可以是小写,u可以与l组合在一起,以生成ulong

虽然后缀不区分大小写,但请记住它在C#语言规范中的说法,第2.4.4.2节:

  

作为一种风格问题,建议在编写long类型的文字时使用“L”代替“l”,因为很容易将字母“l”与数字“1”混淆。

答案 1 :(得分:14)

0m将为您提供decimal 0值。

为了完整起见,

0.0 - double
0f  - float
0m  - decimal

答案 2 :(得分:2)

float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我认为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));
    }
}

答案 6 :(得分:0)

改为使用0.0m - m表示decimal