Я хочу использовать track-bar для изменения непрозрачности формы.
Вот мой код:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Когда я собираю приложение, оно выдает следующую ошибку:
Cannot implicitly convert type
decimal
todouble
.
Я пробовал использовать 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;
Более общий ответ на общий вопрос "Decimal vs Double? ": Decimal для денежных вычислений, чтобы сохранить точность, Double для научных вычислений, на которые не влияют небольшие различия. Поскольку Double - это тип, который является родным для CPU (внутреннее представление хранится в base 2), вычисления, производимые с помощью Double, выполняются лучше, чем Decimal (который внутренне представлен в base 10).
Ваш код работал нормально в VB.NET потому что это неявно делает любой скинется, а в C# есть как косвенные, так и явными.
В C# преобразование из десятичной в дабл явный, как вы теряете точность. Например, 1.1 может'т быть точно выражено как двухместная, но может в виде десятичной дроби (см. фильм "1 и quot[числа с плавающей точкой - более неточным, чем ты думаешь]; ибо причина).
В VB это преобразование было добавлено для вас компилятором:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
Что `(двойная) должны быть прямо указаны в C#, но можно подразумевается В. Б.'s больше 'прощать' сост.
Почему вы деления на 5000? Просто установите ползунком'с минимальным и максимальным значениями между 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;
}
У вас есть две проблемы. Во-первых, "непрозрачность" требует двойной, а не десятичные значения. Компилятор говорит вам, что пока существует преобразования между десятичной и двойная, это явное преобразование, что вам нужно указать для того, чтобы работать. Второй заключается в том, что ползунком.Значение-это целое число и деления int на результаты инт в инт не имеет значения, какой тип переменной присвоить его. В этом случае есть неявное преобразование из int в decimal или Double - потому что нет никакой потери точности, когда вы делаете бросок - поэтому компилятор не'т жаловаться, но значение, которое вы получаете всегда 0, по-видимому, с ползунком.Значение всегда меньше, чем 5000. Решение, чтобы изменить свой код, чтобы использовать двойные (родной тип для непрозрачности) и делать арифметику с плавающей точкой, явно делая постоянные двойные, последствия которого будут способствовать арифметика - или литья
ползунком.Значение` в двойной, который будет делать то же самое - или оба. Ой, а вы не'т необходимость промежуточной переменной, если она используется в другом месте. Я думаю, компилятор все равно оптимизирует его,.
trackBar.Opacity = (double)trackBar.Value / 5000.0;
На мой взгляд, желательно быть как можно более откровенными. Это добавляет ясности в код и СПИД ваших коллег-программистов, которые в конечном итоге могут прочитать.
В дополнение к (или вместо) добавить .0
в число, вы можете использовать десятичные.Метод 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);
В непрозрачность свойство типа double:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
или просто:
this.Opacity = trackBar1.Value / 5000.0;
или:
this.Opacity = trackBar1.Value / 5000d;
Обратите внимание, что я использую 5000.0
(или 5000d
) в силу двойное деление, поскольку trackBar1 .Значение
- это целое число и оно будет выполнять целочисленное деление и результат будет целым числом.
Предполагая, что вы используете приложения WinForms, форма.Непрозрачность
имеет тип double
, так что вы должны использовать:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
Если вам нужно значение в другом месте, это'ы проще написать:
this.Opacity = trackBar1.Value / 5000.0;
Почему контроль не'т работу, когда вы изменили свой код, чтобы просто быть двойным, потому что:
double trans = trackbar1.Value / 5000;
который интерпретировал 5000
как целое, и потому что trackbar1.Значение является целочисленным значением ваш "транс" всегда был ноль. Явно делая числовое значение с плавающей точкой путем добавления .0
компилятор теперь может интерпретировать это как двойное и выполнить правильный расчет.
Так как "непрозрачность" имеет двойное значение, я бы просто использовать двойную с самого начала и не бросил вовсе, но будьте уверены, чтобы использовать двойной при делении, так что вы Дон'т потерять ни точности
Opacity = trackBar1.Value / 5000.0;
this.Opacity = trackBar1.Value / 5000d;