Суффикс типа С# для десятичного числа
Я не знаю, какова правильная формулировка для того, чего я пытаюсь достичь, поэтому он уже может быть опубликован в Интернете. Будьте добры, если это так.
Хорошо, так что в основном у меня есть этот метод.
public static T IsNull<T>(IDataReader dr, String name, T nullValue)
{
return Helpers.IsNull(dr, dr.GetOrdinal(name), nullValue);
}
public static T IsNull<T>(IDataReader dr, Int32 index, T nullValue)
{
if (dr.IsDBNull(index))
{
return nullValue;
}
else
{
return (T)dr.GetValue(index);
}
}
Будучи вызванным как Helpers.IsNull(dr, "UnitWholeSale", 0d)
, и ошибка, которую я получаю, это "Невозможно преобразовать из двойного в десятичный".
Теперь я знаю, что могу использовать decimal.Zero
, но есть ли способ, которым я могу просто пойти 0дек или что-то подобное? Я просто ненавижу те длинные ярлыки (особенно когда вы вызываете конструктор с 20 параметрами).
Ответы
Ответ 1
0m
заключается в том, как вы говорите (decimal)0
, потому что m
- это суффикс, который означает decimal
.
Другие суффиксы f
для float
, d
для double
, u
для unsigned
и l
для long
. Они могут быть как верхним, так и нижним регистром, а u
можно комбинировать с l
в любом порядке, чтобы сделать ulong
.
Хотя суффиксы не чувствительны к регистру, имейте в виду, что он говорит в спецификации языка С#, раздел 2.4.4.2:
В качестве стиля предлагается использовать "L" вместо "l" при написании литералов типа long, так как легко сбить букву "l" цифрой "1".
Ответ 2
0m
даст вам значение decimal
0.
Для полноты,
0.0 - double
0f - float
0m - decimal
Ответ 3
M
является суффиксом для значений decimal
, например. 200.32M
рассматривается как тип decimal
для компилятора.
Ответ 4
Вместо использования 0d
вы можете использовать 0m
для десятичных значений.
Ответ 5
Я предполагаю, что nullValue
действительно defaultvalue
, иначе вы могли бы просто сделать
public static T IsNull<T>(IDataReader dr, Int32 index)
{
if (dr.IsDBNull(index))
{
return default(T);
}
else
{
return (T)dr.GetValue(index);
}
}
Также более внимательно изучая ваш метод, вы, вероятно, хотите получить конвертируемое значение и используйте Convert.ChangeType()
, Не думаю, что простая кастинг будет работать для всех типов:
public static T IsNull<T>(IDataReader dr, Int32 index) where T: IConvertible
{
if (dr.IsDBNull(index))
{
return default(T);
}
else
{
return (T)Convert.ChangeType(dr.GetValue(index), typeof(T));
}
}
Ответ 6
float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;
Помните, что каждый последний пример - это литье, и поэтому может потерять точность
Ответ 7
Используйте 0.0m
вместо - m
обозначает decimal
.