为什么编译器不能决定类型

San*_*eep 5 .net c# implicit-conversion

我很想知道为什么我们需要为小数类型追加m或M?

文档说没有隐式转换

我认为编译器有足够的信息,因为我们声明Decimal关键字.

可以请一些人解释为什么编译器不能确定该值应该被视为十进制而不是双精度.

dtb*_*dtb 5

如果您有这样的声明

decimal x = 5.6;
Run Code Online (Sandbox Code Playgroud)

编译器首先只查看赋值(5.6)的右侧,确定其类型(double),然后检查结果是否可以分配给左侧的变量(x).

由于x被声明为decimal但编译器已确定该表达式的类型是double(并且不存在隐式转换从doubledecimal),分配无效.

(此规则的唯一例外是将lambda表达式赋给委托变量.在这种情况下,编译器确实使用左侧的信息来确定右侧的类型.)

  • 这就解释了为什么它以它的方式工作,但它没有解释为什么编译器*不能*做OP所预期的(实际上它可以).微妙的差异,可能值得一提. (2认同)