我想将十进制变量“trans”分配给双变量“this.Opacity”。

decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;

当我构建应用程序时,会出现以下错误:

无法将类型decimal隐式转换为double


当前回答

您应该使用5000.0而不是5000。

其他回答

由于“不透明度”是一个双精度值,我将从一开始就使用双精度,而不进行强制转换,但在除法时一定要使用双精度值以便不会丢失任何精度:

Opacity = trackBar1.Value / 5000.0;

你为什么要除以5000?只需将TrackBar的“最小值”和“最大值”设置在0和100之间,然后将“值”除以“不透明度”百分比100。以下最少20个示例可防止表单完全不可见:

private void Form1_Load(object sender, System.EventArgs e)
{
    TrackBar1.Minimum = 20;
    TrackBar1.Maximum = 100;

    TrackBar1.LargeChange = 10;
    TrackBar1.SmallChange = 1;
    TrackBar1.TickFrequency = 5;
}

private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
    this.Opacity = TrackBar1.Value / 100;
}

不需要像这样显式转换为double:

double trans = (double) trackBar1.Value / 5000.0;

将常数确定为5000.0(或5000d)就足够了:

double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;

OG事实:Double类型表示比Decimal更广泛的可能值。

铸造为双重

decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;

类型转换

decimal trans = trackBar1.Value / 5000m;
this.Opacity = decimal.ToDouble(trans);

无显式强制转换/转换

在这种情况下,在常量5000d或“.0”5000.0的末尾添加“d”将标识所需的类型。当运算中没有常数时,只需将十进制变量乘以1.0或1d。

假设您使用的是WinForms,Form.Optity是double类型,因此您应该使用:

double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;

除非您在其他地方需要该值,否则写起来更简单:

this.Opacity = trackBar1.Value / 5000.0;

当您将代码更改为简单的双精度时,控件不起作用的原因是:

double trans = trackbar1.Value / 5000;

它将5000解释为整数,因为trackbar1.Value也是整数,所以trans值始终为零。通过添加.0显式地使数字成为浮点值,编译器现在可以将其解释为双精度值并执行正确的计算。