Je suis en train d'écrire un accesseur de propriété en cache générique comme ce qui suit, mais je reçois une erreur de compilation lorsque vous essayez de vérifier si la variable de stockage contient déjà une valeur:Comment tester une variable de type générique pour l'égalité avec Default (T) dans Delphi?
function TMyClass.GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
begin
if ADataValue = Default(T) then // <-- compiler error on this line
ADataValue := ARetriever();
Result := ADataValue;
end;
L'erreur que je reçois est " E2015 Opérateur non applicable à ce type d'opérande ".
Est-ce que je dois mettre une contrainte sur T
pour faire ce travail? Le fichier d'aide indique que Default()
accepterait tout sauf les types génériques. Dans mon cas, je traite principalement avec des types simples comme String
, Integer
et TDateTime
.
Ou est-il une autre fonction de bibliothèque pour effectuer cette vérification particulière?
J'utilise Delphi 2009 dans l'affaire qui compte.
PS: Juste au cas où il ne ressort pas du code ce que je suis en train de faire: Dans mon cas, la détermination des valeurs de propriété réelle peut prendre un certain temps pour diverses raisons et parfois je pourrais même pas besoin eux du tout. Du côté positif, cependant, les valeurs sont constantes, donc je veux seulement appeler le code qui détermine la valeur réelle la première fois que cette propriété est accédée, puis stocker la valeur dans un champ de classe et la prochaine fois que cette propriété est retournée. directement. Voici un exemple de la façon dont j'espérais pouvoir utiliser ce code:
type
TMyClass = class
private
FSomeProp: String;
function GetSomeProp: String;
function GetProp<T>(var ADataValue: T; const ARetriever: TFunc<T>): T;
public
property SomeProp read GetSomeProp;
end;
function GetSomeProp: String;
begin
Result := GetProp<String>(FSomeProp,
function: String
begin
Result := SomeSlowOrExpensiveCalculation;
end);
end;
(de toute évidence, il y a plus d'une propriété)
+1 bonne idée de la manière. – jpfollenius
Vous devez probablement utiliser un type nullable, sinon le code réévaluera constamment les propriétés qui sont déjà mises en cache mais qui ont la valeur par défaut. Voir par exemple http://blogs.embarcadero.com/abauer/2008/09/18/38869 – mghie
@mghie: Bon point et d'habitude je suis d'accord, mais dans ce cas particulier, la valeur par défaut peut en toute sécurité toujours être interprété comme « non initialisée » . –