C# 十进制的类型后缀

C# Type suffix for decimal

提问人:Maxim Gershkovich 提问时间:3/17/2011 最后编辑:Maxim Gershkovich 更新时间:8/9/2016 访问量:47775

问:

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

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

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)

现在我知道我可以使用,但是有没有办法让我简单地去 0dec 或类似的东西?我只是讨厌那些长快捷方式值(尤其是当您调用具有 20 个参数的构造函数时)。decimal.Zero

C# 十进制 类型推理

评论


答:

0赞 Daniel A. White 3/17/2011 #1

改用 - 表示 。0.0mmdecimal

评论

4赞 Eniola 1/6/2016
0.0米?为什么不只是 0m?
23赞 Adam Robinson 3/17/2011 #2

0m会给你一个 0 值。decimal

为了完整起见,

0.0 - double
0f  - float
0m  - decimal
90赞 Gabe 3/17/2011 #3

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

其他后缀是 for 、 for 、 for 和 for 。它们可以是大写或小写,并且可以按任一顺序组合以形成 .ffloatddoubleuunsignedllongululong

尽管后缀不区分大小写,但请记住 C# 语言规范第 2.4.4.2 节中的内容:

作为风格问题,建议在书写长字时使用“L”而不是“l”,因为很容易将字母“l”与数字“1”混淆。

评论

14赞 Eric Lippert 3/17/2011
并且要小心那个小写的 el。快,5432l == 54321 是真是假?:-)
7赞 Gabe 3/17/2011
@Eric:我有幸拥有一种字体,可以很容易地区分 1 和 ell,但我引用了规范建议使用大写,因为你提醒了我。
1赞 user153498 3/17/2011 #4

M是值的后缀,例如 被视为编译器的类型。decimal200.32Mdecimal

1赞 Reed Copsey 3/17/2011 #5

您可以不使用 ,而是用于十进制值。0d0m

1赞 BrokenGlass 3/17/2011 #6

我想真的是,否则你可以做nullValuedefaultvalue

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赞 Maxim Gershkovich 3/17/2011
谢谢你的提示......我不知道这样的功能。nullValue 最好表示为 defaultValue,因为除了默认值之外,我从未真正使用过任何其他内容。
1赞 BrokenGlass 3/17/2011
@Maxim:更新了更通用的版本
0赞 Maxim Gershkovich 3/17/2011
再次感谢伙计,我喜欢当你真正学到一些东西时进行代码审查。
3赞 jh.edens 8/9/2016 #7
float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;

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