Подтвердить что ты не робот

Суффикс типа С# для десятичного числа

Я не знаю, какова правильная формулировка для того, чего я пытаюсь достичь, поэтому он уже может быть опубликован в Интернете. Будьте добры, если это так.

Хорошо, так что в основном у меня есть этот метод.

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 параметрами).

4b9b3361

Ответ 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.