от
Я хочу использовать трек-бар для изменения формы непрозрачности. Это мой код:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Когда я построить приложение, он выдает следующее сообщение об ошибке: Не удается неявно преобразовать тип 'десятичное число' в тип 'double'. Я попытался с помощью транс и двойной, но тогда управление не работает. Этот код работал нормально в прошлом проекте VB.NET .

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

13 Ответы

0 голосов
от
Явное приведение к такой двойной не надо:
double trans = (double) trackBar1.Value / 5000.0;
Определив константу 5000.0 (или как 5000d) достаточно:
double trans = trackBar1.Value / 5000.0;
double trans = trackBar1.Value / 5000d;
0 голосов
от
Более общий ответ на общий вопрос "десятичные против двойной?": Десятичное для денежных расчетов для сохранения точности, двойной для научных расчетов, которые не влияют небольшие различия. С двойным типом, который является родным для процессора (внутреннее представление хранится в базе 2), расчеты выполнены с двойным лучше тогда десятичной системе (то есть по основанию 10 внутренних).
0 голосов
от
Ваш код работал нормально в VB.NET потому что это неявно делает любой скинется, а в C# есть как косвенные, так и явными. В C# преобразование из десятичной в дабл явный, как вы теряете точность. Например 1.1, не могут быть точно выражены как двухместная, но может как десятичное число (см. "числа с плавающей точкой - более неточным, чем вы думаете" по той причине, почему). В VB это преобразование было добавлено для вас компилятором:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
Что (двойной) должно быть явно указано в C#, но можно предположить более В. Б. ошибки компилятора.
0 голосов
от
Почему вы деления на 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;
}
0 голосов
от
У вас есть две проблемы. Во-первых, непрозрачность требует двойной, а не десятичные значения. Компилятор говорит вам, что пока существует преобразования между десятичной и двойная, это явное преобразование, что вам нужно указать для того, чтобы работать. Второй заключается в том, что компонента trackbar.Значение-целое число и деления int на результаты инт в инт не имеет значения, какой тип переменной присвоить его. В этом случае есть неявное преобразование из int в decimal или Double - потому что нет никакой потери точности, когда вы делаете бросок - поэтому компилятор не жалуется, но значение, которое вы получите всегда 0, по-видимому, с ползунком.Значение всегда меньше, чем 5000. Решение, чтобы изменить свой код, чтобы использовать двойные (родной тип для непрозрачности) и делать арифметику с плавающей точкой, явно делая постоянные двойные, последствия которого будут способствовать арифметика - или ползунком литья.Стоимость удвоится, что будет делать то же самое - или оба. Ох, и вы не нуждаетесь в промежуточной переменной, если она используется в другом месте. Я думаю, компилятор все равно оптимизирует его,.
trackBar.Opacity = (double)trackBar.Value / 5000.0;
0 голосов
от
На мой взгляд, желательно быть как можно более откровенными. Это добавляет ясности в код и СПИД ваших коллег-программистов, которые в конечном итоге могут прочитать. В дополнение к (или вместо) добавить .0 количеству, можно использовать дробные.Метод todouble(). Вот некоторые примеры: 2vOMYo0ZK0YEntS4tM6t6
0 голосов
от
Это звучит примерно так.Непрозрачность-это двойное значение, и компилятору не нравится, что ты пытаешься впихнуть в себя десятичное значение в него.
0 голосов
от
Вы должны использовать 5000.0 вместо 5000.
0 голосов
от
Свойство opacity имеет тип 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.Значение является целым числом, он будет выполнять целочисленное деление и результат будет целым числом.
0 голосов
от
Предполагая, что вы используете приложения 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 теперь компилятор может интерпретировать ее как двойной и выполнить правильный расчет.
...