可能重复:
.Net 中的 Int128?
在我决定用 C# 实现我的 Int128 之后,我认为让它看起来像其他 dotNet 数据类型会很好。但我无法实现以下功能:
- 后缀初始化:如13L和0.2D
我可以在 C# 中制作自己的后缀吗?
如果我不能......我该如何初始化它?
IE
Int128 a= ??
可能重复:
.Net 中的 Int128?
在我决定用 C# 实现我的 Int128 之后,我认为让它看起来像其他 dotNet 数据类型会很好。但我无法实现以下功能:
我可以在 C# 中制作自己的后缀吗?
如果我不能......我该如何初始化它?
IE
Int128 a= ??
不,您不能在 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