web-dev-qa-db-fra.com

C # Suffixe de type pour décimal

Je ne sais pas quelle est la formulation correcte pour ce que j'essaie de réaliser, donc elle peut déjà être affichée en ligne. Veuillez être gentil si c'est le cas.

Ok donc en gros j'ai cette méthode.

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);
    }
}

Être appelé en tant que Helpers.IsNull(dr, "UnitWholeSale", 0d) et l'erreur que j'obtiens est "Impossible de convertir du double en décimal".

Maintenant, je sais que je peux utiliser decimal.Zero Mais y a-t-il un moyen de passer simplement à 0 déc ou quelque chose de similaire? Je déteste juste ces longues valeurs de raccourci (surtout lorsque vous appelez un constructeur avec 20 paramètres).

33
Maxim Gershkovich

0m c'est comme ça que vous dites (decimal)0 car m est le suffixe qui signifie decimal.

Les autres suffixes sont f pour float, d pour double, u pour unsigned et l pour long. Ils peuvent être en majuscules ou en minuscules et u peut être combiné avec l dans l'un ou l'autre ordre pour créer un ulong.

Bien que les suffixes ne respectent pas la casse, gardez à l'esprit ce qu'il dit dans la spécification du langage C #, section 2.4.4.2:

Pour des raisons de style, il est suggéré d'utiliser "L" au lieu de "l" lors de l'écriture de littéraux de type long, car il est facile de confondre la lettre "l" avec le chiffre "1".

70
Gabe

0m vous donnera une valeur de decimal 0.

Par souci d'exhaustivité,

0.0 - double
0f  - float
0m  - decimal
15
Adam Robinson
float value = 0f || 0.0f || (float)0;
double value = 0d || 0.0d || (double)0;
decimal value = 0m || 0.0m || (decimal)0;

Sachez que chaque dernier exemple est un plâtre et peut donc perdre en précision

3
jh.edens

M est le suffixe des valeurs de decimal, par exemple 200.32M est considéré comme étant de type decimal pour le compilateur.

1
user153498

À la place d'utiliser 0d, vous pouvez utiliser 0m pour les valeurs décimales.

1
Reed Copsey

Je suppose que nullValue est vraiment defaultvalue, sinon vous pourriez simplement faire

public static T IsNull<T>(IDataReader dr, Int32 index)
{
    if (dr.IsDBNull(index))
    {
        return default(T);
    }
    else
    {
        return (T)dr.GetValue(index);
    }
}

En regardant également de plus près votre méthode, vous voulez probablement une valeur convertible et utilisez Convert.ChangeType() , je ne pense pas que le casting simple fonctionnerait pour tous les types:

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
BrokenGlass

Utilisation 0.0m à la place - m désigne decimal.

0
Daniel A. White