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

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

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

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


当前回答

您的代码在VB.NET中运行良好,因为它隐式执行任何强制转换,而C#同时具有隐式和显式强制转换。

在C#中,从十进制到双精度的转换是显式的,因为您会丢失精度。例如,1.1不能准确地表示为双精度,但可以表示为十进制(请参阅“浮点数字-比您想象的更不准确”,了解原因)。

在VB中,编译器为您添加了转换:

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

这(double)必须在C#中明确表示,但可以通过VB更“宽容”的编译器来暗示。

其他回答

请尝试以下代码:

十进制值

decimal d1 = 3234.3434m;

转换为双精度

double r1 = Decimal.ToDouble(d1);

在我看来,尽可能明确是可取的。这增加了代码的清晰度,并有助于最终可能阅读它的程序员同事。

除了(或代替)在数字后面附加一个.0,还可以使用decimal.ToDouble()。

以下是一些示例:

// Example 1
double transparency = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transparency);

// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);

您的代码在VB.NET中运行良好,因为它隐式执行任何强制转换,而C#同时具有隐式和显式强制转换。

在C#中,从十进制到双精度的转换是显式的,因为您会丢失精度。例如,1.1不能准确地表示为双精度,但可以表示为十进制(请参阅“浮点数字-比您想象的更不准确”,了解原因)。

在VB中,编译器为您添加了转换:

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

这(double)必须在C#中明确表示,但可以通过VB更“宽容”的编译器来暗示。

最佳解决方案是:

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

“不透明度”属性为双重类型:

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

或者简单地:

this.Opacity = trackBar1.Value / 5000.0;

or:

this.Opacity = trackBar1.Value / 5000d;

请注意,我使用5000.0(或5000d)强制进行二次除法,因为trackBar1.Value是整数,它将执行整数除法,结果将是整数。