8

可能重复:
.Net 中的 Int128?

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

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

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

Int128 a= ??
4

4 回答 4

17

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

可以int、和进行隐式转换long,从而允许:uintulong

Int128 a = 100;

但是您将无法指定大于ulong.MaxValue该方式的值。

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

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

于 2010-05-12T14:25:52.450 回答
8

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

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

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

于 2010-05-12T14:27:08.493 回答
1

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

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

于 2010-05-12T14:28:03.857 回答
1

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

于 2010-05-12T14:30:20.023 回答