【问题标题】:C# Custom data type! [duplicate]C#自定义数据类型! [复制]
【发布时间】:2011-02-18 15:58:24
【问题描述】:

可能重复:
Int128 in .Net?

在我决定用 C# 实现我的 Int128 之后,我认为让它看起来像其他 dotNet 数据类型会很好。但是我无法实现以下功能:

  • 后缀初始化:如13L和0.2D

我可以在 C# 中创建自己的后缀吗?
如果我不能......我该如何初始化它?

Int128 a= ??

【问题讨论】:

标签: c# types constructor int128


【解决方案1】:

不,您不能在 C# 中创建自己的文字形式。

可以intlonguintulong 进行隐式转换,允许:

Int128 a = 100;

但您无法通过这种方式指定大于ulong.MaxValue 的值。

decimal 进行隐式转换将允许更大的范围,但这是一个坏主意,因为您会丢失任何不只是整数的值的数据。

基本上没有什么可以保证字面量的整数值大于ulong.MaxValue - 你可以解析一个字符串,但这并不理想。或者,您可以创建一个构造函数,它采用 两个 ulong,一个用于底部 64 位,一个用于顶部 64 位。

【讨论】:

    【解决方案2】:

    您不能创建自己的后缀初始化器 - 这是语言的一部分并被嵌入编译器。另一方面,如果您编写自己的 C# 编译器,则可以做任何您想做的事情并以您希望的任何方式扩展它。

    至于您将如何初始化它 - 这取决于您如何编写它。如果它是一个类,则需要使用 new 关键字对其进行初始化,或者编写一些隐式转换为精度较低的数值类型。

    正如 Jon 所指出的,如果不进行一些字符串操作,您将无法将其实际设置为大于 ulong.MaxValue 的值。您还必须以某种形式在内部表示(字符串?一些ulongs?)并确保所有转换和操作都正常工作(溢出呢?)。

    【讨论】:

      【解决方案3】:

      不,您不能进行后缀初始化。即将发布的 C++ 标准中将提供这种可爱之处……但我离题了。

      最明显的选择是Int128(long hi, ulong lo)Int128(string)

      【讨论】:

        【解决方案4】:

        您可以查看 4.0 中的新 BigInteger 结构以获取有关初始化的提示。 http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

        【讨论】:

          猜你喜欢
          • 2012-12-14
          • 1970-01-01
          • 2012-03-28
          • 1970-01-01
          • 1970-01-01
          • 2017-08-03
          • 2012-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多