我想用一个轨迹条来改变一个表单的不透明度。
这是我的代码。
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
当我构建该应用程序时,它给出了以下错误。
不能隐含地将类型
decimal
转换为double
。
我试着用trans
和double
,但后来控件不工作了。这段代码在过去的一个VB.NET项目中运行良好。
像这样明确地投给double
是没有必要的。
double trans = (double) trackBar1.Value / 5000.0;
将常数标识为 "5000.0"(或 "5000d")即可。
double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
你的代码在VB.NET中工作得很好,因为它隐式地进行任何转换,而C#有隐式和显式两种。
在C#中,从小数到双数的转换是显式的,因为你失去了准确性。 例如,1.1不能准确地表示为双数,但可以表示为小数(参见"[浮点数字--比你想象的更不准确][1]" 的原因)。)
在VB中,这个转换是编译器为你添加的。
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
那个(double)
必须在C#中明确说明,但可以由VB'更'宽容的'.编译器implied。
编译器。
[1]: http://bizvprog.blogspot.com/2008/05/floating-point-numbers-more-inaccurate.html
为什么要除以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;
}
你有两个问题。
首先,"Opacity "需要一个双数,而不是十进制值。
编译器告诉你,虽然小数和双数之间有一个转换,但这是一个显式转换,你需要指定它才能工作。
第二种是TrackBar.Value
是一个整数值,用int除以int的结果是int,不管你把它分配给什么类型的变量。
在这种情况下,有一个隐式的从int到十进制或双数的转换--因为当你做转换时没有精度损失--所以编译器不会抱怨,但你得到的值总是0,大概是因为trackBar.Value
总是小于5000。
解决的办法是把你的代码改成使用double(Opacity的原生类型),并通过显式地把常量设为double来进行浮点运算--这将起到促进运算的作用--或者把trackBar.Value
转为double,这将起到同样的作用--或者两者兼而有之。
哦,你不需要中间变量,除非它用在其他地方。
我猜编译器会把它优化掉。
trackBar.Opacity = (double)trackBar.Value / 5000.0;
在我看来,最好是尽可能的明确。 这可以增加代码的清晰度,并帮助你的程序员同事最终阅读它。
除了(或代替)在数字上添加.0
之外,你还可以使用decimal.ToDouble()
。
下面是一些例子。
// Example 1
double transperancy = trackBar1.Value/5000;
this.Opacity = decimal.ToDouble(transperancy);
// Example 2 - with inline temp
this.Opacity = decimal.ToDouble(trackBar1.Value/5000);
不透明度]1属性为双类型。
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
或者干脆。
this.Opacity = trackBar1.Value / 5000.0;
或。
this.Opacity = trackBar1.Value / 5000d;
请注意,我使用5000.0
(或5000d
)来强制执行双除法,因为[trackBar1.Value
][2]是一个整数,它会执行一个整数除法,结果是一个整数。
1:
[2]: http://msdn.microsoft.com/en-us/library/system.windows.forms.trackbar.value.aspx
假设您使用的是WinForms,Form.Opacity
的类型是double
,所以您应该使用:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
。
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
明确地将数值变成浮点值,编译器现在可以将其解释为双数并进行正确的计算。