【发布时间】:2011-02-18 15:58:24
【问题描述】:
可能重复:
Int128 in .Net?
在我决定用 C# 实现我的 Int128 之后,我认为让它看起来像其他 dotNet 数据类型会很好。但是我无法实现以下功能:
- 后缀初始化:如13L和0.2D
我可以在 C# 中创建自己的后缀吗?
如果我不能......我该如何初始化它?
即
Int128 a= ??
【问题讨论】:
标签: c# types constructor int128
可能重复:
Int128 in .Net?
在我决定用 C# 实现我的 Int128 之后,我认为让它看起来像其他 dotNet 数据类型会很好。但是我无法实现以下功能:
我可以在 C# 中创建自己的后缀吗?
如果我不能......我该如何初始化它?
即
Int128 a= ??
【问题讨论】:
标签: c# types constructor int128
不,您不能在 C# 中创建自己的文字形式。
您可以从int、long、uint 和ulong 进行隐式转换,允许:
Int128 a = 100;
但您无法通过这种方式指定大于ulong.MaxValue 的值。
从decimal 进行隐式转换将允许更大的范围,但这是一个坏主意,因为您会丢失任何不只是整数的值的数据。
基本上没有什么可以保证字面量的整数值大于ulong.MaxValue - 你可以解析一个字符串,但这并不理想。或者,您可以创建一个构造函数,它采用 两个 ulong,一个用于底部 64 位,一个用于顶部 64 位。
【讨论】:
您不能创建自己的后缀初始化器 - 这是语言的一部分并被嵌入编译器。另一方面,如果您编写自己的 C# 编译器,则可以做任何您想做的事情并以您希望的任何方式扩展它。
至于您将如何初始化它 - 这取决于您如何编写它。如果它是一个类,则需要使用 new 关键字对其进行初始化,或者编写一些隐式转换为精度较低的数值类型。
正如 Jon 所指出的,如果不进行一些字符串操作,您将无法将其实际设置为大于 ulong.MaxValue 的值。您还必须以某种形式在内部表示(字符串?一些ulongs?)并确保所有转换和操作都正常工作(溢出呢?)。
【讨论】:
不,您不能进行后缀初始化。即将发布的 C++ 标准中将提供这种可爱之处……但我离题了。
最明显的选择是Int128(long hi, ulong lo) 和Int128(string)。
【讨论】:
您可以查看 4.0 中的新 BigInteger 结构以获取有关初始化的提示。 http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx
【讨论】: