【问题标题】:C# Type suffix for decimal十进制的 C# 类型后缀
【发布时间】:2011-07-17 01:13:22
【问题描述】:

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

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

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 个参数的构造函数时)。

【问题讨论】:

    标签: c# types double decimal type-inference


    【解决方案1】:

    改用0.0m - m 表示decimal

    【讨论】:

    • 0.0m?为什么不只是 0m?
    【解决方案2】:

    0m 会给你一个decimal 0 值。

    为了完整起见,

    0.0 - double
    0f  - float
    0m  - decimal
    

    【讨论】:

      【解决方案3】:

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

      其他后缀是f 用于floatd 用于doubleu 用于unsignedl 用于long。它们可以是大写或小写,u 可以与l 组合成ulong

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

      在风格上,建议在编写 long 类型的文字时使用“L”而不是“l”,因为很容易将字母“l”与数字“1”混淆。

      【讨论】:

      • 小心那个小写的 el。快,5432l == 54321 是真是假? :-)
      • @Eric:我很幸运有一种字体可以很容易地区分 ell 和 ell,但我引用了规范建议使用大写,因为你提醒了我。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您可以使用0m 代替0d 来表示十进制值。

        【讨论】:

          【解决方案6】:

          我假设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));
              }
          }
          

          【讨论】:

          • 感谢您的提示...我不知道这样的功能。 nullValue 最好用 defaultValue 表示,因为我从不真正使用除默认值之外的任何东西。
          • @Maxim:更新为更通用的版本
          • 再次感谢伙计,当你真正学到一些东西时,我喜欢代码审查。
          【解决方案7】:
          float value = 0f || 0.0f || (float)0;
          double value = 0d || 0.0d || (double)0;
          decimal value = 0m || 0.0m || (decimal)0;
          

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

          【讨论】:

            猜你喜欢
            • 2011-03-17
            • 2011-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-15
            • 1970-01-01
            • 2021-01-31
            • 2021-02-10
            相关资源
            最近更新 更多