Я хочу использовать a, Track-Bar
чтобы изменить Form
непрозрачность.
Это мой код:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
Когда я создаю приложение, оно выдает следующую ошибку:
Невозможно неявно преобразовать тип
decimal
вdouble
Я попытался с помощью trans
и , double
но тогда Control
не работает. Этот код прекрасно работал в прошлом проекте VB.NET.
c#
floating-point
type-conversion
double
decimal
яйца McLaren
источник
источник
Ответы:
Явное приведение к
double
подобному не обязательно:Идентификация константы как
5000.0
(или как5000d
) достаточна:источник
Более общий ответ на общий вопрос «Десятичное число против двойного?»: Десятичное для денежных расчетов, чтобы сохранить точность, Двойное для научных вычислений, на которые не влияют небольшие различия. Поскольку Double является типом, который является родным для ЦП (внутреннее представление хранится в базе 2 ), вычисления, выполненные с помощью Double, работают лучше, чем Decimal (который представлен внутри базы 10 ).
источник
Ваш код отлично работал в VB.NET, потому что он неявно выполняет любые приведения, в то время как в C # есть как неявные, так и явные.
В C # преобразование десятичного числа в двойное явное, поскольку вы теряете точность. Например, 1.1 не может быть точно выражен как двойное число, но может быть как десятичное число (см. « Числа с плавающей точкой - более неточные, чем вы думаете » по причине).
В VB преобразование было добавлено для вас компилятором:
Это
(double)
должно быть явно указано в C #, но может подразумеваться более «прощающим» компилятором VB.источник
Почему ты делишь на 5000? Просто установите минимальное и максимальное значения TrackBar в диапазоне от 0 до 100, а затем разделите значение на 100 для процента непрозрачности. Минимум 20 приведенных ниже примеров препятствуют тому, чтобы форма стала полностью невидимой:
источник
5000
OP будет проблема с100
?У тебя две проблемы. Во-первых,
Opacity
требуется двойное, а не десятичное значение. Компилятор говорит вам, что, хотя есть преобразование между десятичным и двойным, это явное преобразование, которое вам нужно указать, чтобы оно работало. Второе -TrackBar.Value
это целочисленное значение, и деление int на int приводит к int независимо от того, к какому типу переменной вы его назначаете. В этом случае происходит неявное приведение от int к десятичному или двойному - потому что при выполнении преобразования нет потери точности - поэтому компилятор не будет жаловаться, но полученное вами значение всегда равно 0, предположительно, так какtrackBar.Value
всегда меньше 5000. Решение состоит в том, чтобы изменить ваш код на использование double (собственный тип для Opacity) и выполнять арифметику с плавающей запятой, явно делая константу double, что приведет к повышению арифметики или приведениюtrackBar.Value
к удвоению , который будет делать то же самое - или оба. О, и вам не нужна промежуточная переменная, если она не используется в другом месте. Я предполагаю, что компилятор все равно его оптимизирует.источник
На мой взгляд, желательно быть максимально явным. Это добавляет ясности к коду и помогает вашим коллегам-программистам, которые могут в конечном итоге прочитать его.
Помимо (или вместо) добавления
.0
к номеру, вы можете использоватьdecimal.ToDouble()
.Вот некоторые примеры:
источник
Похоже
this.Opacity
, это двойное значение, и компилятору не нравится, когда вы пытаетесь втиснуть в него десятичное значение.источник
Свойство Opacity имеет двойной тип:
или просто:
или:
Обратите внимание, что я использую
5000.0
(или5000d
) для принудительного двойного деления, потому чтоtrackBar1.Value
это целое число, и оно будет выполнять целочисленное деление, а результатом будет целое число.источник
Вы должны использовать
5000.0
вместо5000
.источник
Предполагая, что вы используете WinForms,
Form.Opacity
имеет типdouble
, поэтому вы должны использовать:Если вам не нужно значение в другом месте, проще написать:
Причина, по которой элемент управления не работает, когда вы изменили свой код на простой, был в том, что вы имели:
который интерпретируется
5000
как целое число, аtrackbar1.Value
также как целое число, вашеtrans
значение всегда было равно нулю. Путем явного присвоения числовому значению значения с плавающей запятой путем добавления.0
компилятора теперь можно интерпретировать его как двойное и выполнить надлежащие вычисления.источник
Лучшее решение:
источник
Поскольку
Opacity
это двойное значение, я бы просто использовал double с самого начала, а не бросал вообще, но обязательно использовал double при делении, чтобы не потерять точностьисточник
источник
Попробуй это:
источник