J'ai écrit une simple classe générique abstraite en C# (.NET 2.0) et je préfère de préférence la limiter aux seuls types de référence, donc je ne peux indiquer aucune valeur par un null. Cependant, je veux aussi utiliser des types tels que long et décimal, pourquoi ne pas autoriser null (étant structs après tout). J'ai considéré faire la classeQuels types utiliser pour la boxe dans les génériques
public abstract Field<Nullable<T>>
{
}
Mais cela empêcherait mon utilisation du type chaîne, qui est une classe. Comment puis-je boxer mes décimales et les longs afin que je puisse les utiliser dans ce générique.
abstract class Field<T>
{
private int _Length = 1;
private bool _Required = false;
protected T _Value; //= null;
public int Length
{
get { return _Length; }
private set
{
if (value < 1) throw new ArgumentException("Field length must be at least one.");
_Length = value;
}
}
public bool Required
{
get { return _Required; }
private set { _Required = value; }
}
public abstract string GetFieldValue();
public abstract void ParseFieldValue(string s);
public virtual T Value
{
get { return _Value; }
set
{
if (value == null && Required)
throw new ArgumentException("Required values cannot be null.");
_Value = value;
}
}
}
Veuillez noter que j'ai besoin de représenter différemment les valeurs numériques 0 et nulles. Pour cette raison, la valeur par défaut (T) ne fonctionnera pas.
Cela peut effectivement fonctionner si les deux descendent d'un ancêtre commun non-générique (Champ) ... –
@ C. Ross - Oui, cela peut très bien fonctionner. J'ai utilisé une classe de base non générique pour activer la branche de l'héritage avant. – stevehipwell