Проблема здесь в том, что компилятор думает, что ваша константа 3.281
имеет тип double
. Если вы собираетесь использовать такой тип, как decimal
, вам придется добавить суффикс m
. Аналогично с типами float
необходимо добавить суффикс f
. За MSDN:
По умолчанию действительный числовой литерал справа от оператора присваивания обрабатывается как double
.
Поэтому, чтобы инициализировать переменную float
, используйте суффикс f
или F
, как в следующем примере:
float x = 3.5F;
Однако, если вы хотите, чтобы целое число рассматривалось как double
, используйте суффикс d
или D
, например:
double x = 3D;
Если вы хотите, чтобы числовой вещественный литерал обрабатывался как decimal
, используйте суффикс m
или M
, например:
decimal myMoney = 300.5m;
Мой совет
Вы должны действительно определить, какой тип вам действительно нужно использовать, прежде чем использовать его. В случае конвертации футов в метров я бы использовал double
или float
; double
обычно имеет место, потому что это более точно.
private double feet = 0.0d;
private double meters = 0.0d;
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
feet = Convert.ToDouble(Feet.Text);
meters = feet / 3.281d;
}
Тип decimal
обычно используется для хранения денежных значений, где double
и float
используются для таких вычислений, как этот. Кроме того, это не является обязательным требованием, но если вы когда-либо работаете с несколькими похожими типами, например, float
, double
, decimal
; всегда полезно использовать суффикс для каждого, чтобы четко передать, какой тип вы собираетесь использовать.
Финальная нота
Вы можете привести к decimal
, как указали другие, но это ненужное приведение, когда вы можете просто указать decimal
с помощью 3.281m
. В среде, где важна производительность, следует избегать ненужного приведения типов, когда это возможно.
С другой стороны, вы должны убедиться, что текст, который вы пытаетесь преобразовать, является допустимым значением, прежде чем пытаться преобразовать его. Я предпочитаю использовать TryParse
(все числовые типы должны иметь метод TryParse
, если я правильно помню). Причина этого заключается в том, что если я введу 123a
в ваше текстовое поле в соответствии с тем, как работает ваш метод, он тут же взорвется. Исправить это очень просто:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
if (double.TryParse(Feet.Text, out feet))
meters = feet / 3.281d;
else
MessageBox.Show($"You've entered an invalid value: {Feet.Text}.");
}