.net dotnet 5:十进制自动截断-如何使其中断?

.net dotnet 5:十进制自动截断-如何使其中断?,.net,.net-core,decimal,.net,.net Core,Decimal,以下是使用.Net 5完成的: 编译器不允许使用以下行,因为该数字超过了最大长值: long value = 123456789123456789123456789123456789; // <= Not allowed by compiler 问题是,该值立即被截断为12345678912345678912345678912。因此,该值实际上是在没有任何通知的情况下更改的 我想知道,在这种情况下,dotnet是否可以被设置为爆炸,因为我希望事情能够尽早崩溃,最好是在编译时,或者至少是在

以下是使用.Net 5完成的:

编译器不允许使用以下行,因为该数字超过了最大长值:

long value = 123456789123456789123456789123456789; // <= Not allowed by compiler
问题是,该值立即被截断为12345678912345678912345678912。因此,该值实际上是在没有任何通知的情况下更改的

我想知道,在这种情况下,dotnet是否可以被设置为爆炸,因为我希望事情能够尽早崩溃,最好是在编译时,或者至少是在运行时


有人解决了这个问题吗?

这是故意的。

M
M
作为后缀的实文本属于
decimal
类型。例如,文本
1m
1.5m
1e10m
123.456M
都是
decimal
类型。通过取准确值,并在必要时使用银行家舍入法舍入到最接近的可表示值,将该文本转换为
十进制
值。除非数值四舍五入或数值为零(在后一种情况下,符号和刻度将为
0
),否则将保留文字中明显的任何刻度。因此,将对文字
2.900m
进行解析,形成带符号
0
、系数
2900
和刻度
3
的十进制数


恐怕您唯一的选择是构建一个代码分析器,在这样一行上标记一个错误。

我想十进制的工作原理类似于double,这也不会导致错误。但据我所知,十进制并不像double那样工作,因为它不使用浮点算术?是的,但如果删除“.”从decimal常量开始,它会导致一个错误,因为decimal对于整个部分有固定的位数。关键是,当值由于缺乏准确性而被截断时,不会出现警告/错误,但如果有效部分太大,则会报告错误。@Stephan Møller,但这也不是任意精度;它必须在某个地方循环,因为它已经固定了大小:您从讨论代码中的文本开始,现在您正在讨论Newtonsoft反序列化程序?您的实际用例是什么?
Decimal value = 123456789123456789.123456789123456789m; // No compile time error, no runtime error.