我想使用Track-Bar
来更改Form
的不透明度。
这是我的代码:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
当我构建应用程序时,它给出以下错误:
Cannot implicitly convert type decimal to double
我尝试使用trans
和double
,但是Control
不起作用。这段代码在过去的 VB.NET 项目中运行良好。
不需要像这样的显式强制转换为double
double trans = (double) trackBar1.Value / 5000.0;
将常数标识为5000.0
(或5000d
)就足够了:
double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
通用问题 “十进制与双精度?” 的更通用答案:
十进制用于货币计算以保持精度。 Double是用于不受小差异影响的科学计算。由于 Double 是 CPU 固有的类型(内部表示形式存储在基数 2 中),因此使用 Double 进行的计算性能要好于十进制(内部表示为基数 10 )。
您的代码在 VB.NET 中可以正常工作,因为它隐式地执行任何强制转换,而 C#同时具有隐式和显式强制转换。
在 C#中,由于精度下降,从十进制到双精度的转换是明确的。例如,1.1 不能准确地表示为双精度数,而可以精确地表示为十进制数(请参阅 “ 浮点数 - 比您想象的更不准确”,以了解原因)。
在 VB 中,编译器为您添加了转换:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
该(double)
必须在 C#中明确声明,但可以由 VB 更 “宽容” 的编译器隐含。