Суффикс типа C # для десятичного числа - PullRequest
28 голосов
/ 17 марта 2011

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

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

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, но есть ли способ, которым я могу просто перейти на 0dec или что-то подобное? Я просто ненавижу эти длинные ярлыки (особенно когда вы вызываете конструктор с 20 параметрами).

Ответы [ 7 ]

67 голосов
/ 17 марта 2011

0m - это то, как вы говорите (decimal)0, потому что m - это суффикс, означающий decimal.

Другие суффиксы: f для float, d для double, u для unsigned и l для long. Они могут быть как в верхнем, так и в нижнем регистре, и u можно объединить с l в любом порядке, чтобы получить ulong.

Хотя суффиксы не чувствительны к регистру, имейте в виду то, что говорится в спецификации языка C #, раздел 2.4.4.2:

В качестве стиля предлагается использовать «L» вместо «l» при написании литералов типа long, поскольку легко спутать букву «l» с цифрой «1».

14 голосов
/ 17 марта 2011

0m даст вам значение decimal 0.

Ради полноты

0.0 - double
0f  - float
0m  - decimal
2 голосов
/ 09 августа 2016
float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;

Имейте в виду, что каждый последний пример является приведением и поэтому может потерять точность

1 голос
/ 17 марта 2011

Я полагаю, 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));
    }
}
1 голос
/ 17 марта 2011

Вместо использования 0d вы можете использовать 0m для десятичных значений.

1 голос
/ 17 марта 2011

M - суффикс для значений decimal, например, 200.32M считается компилятором типа decimal.

0 голосов
/ 17 марта 2011

Используйте 0.0m вместо - m обозначает decimal.

...