Delphi在函数中分配通用值

时间:2017-07-03 13:40:33

标签: delphi generics

由于Delphi(遗憾地)不支持 nullable 类型,我想尝试自己实现它们。这是我到目前为止所写的:

unit Nullable;

interface

uses
 System.SysUtils, Generics.Collections;

type
 Nullable<T> = class
  private
   FValue: T;
   FHasValue: boolean;
   function getValue: T;
   procedure setValue(const val: T);
  public
   constructor Create(value: T);
   procedure setNull;
   property value: T read getValue write setValue;
   property hasValue: boolean read FHasValue;
 end;

implementation

{ Nullable<T> }

constructor Nullable<T>.Create(value: T);
begin
 Fvalue := value;
 FHasValue := true;
end;

procedure Nullable<T>.setNull;
begin
 FHasValue := false;
end;

procedure Nullable<T>.setValue(const val: T);
begin
 FHasValue := true;
 FValue := T; //COMPILER ERROR HERE
end;

function Nullable<T>.getValue: T;
begin

 if (FHasValue = false) then
  raise Exception.Create('There is not a value!');

 Result := T;

end;

end.

似乎我无法向FValue提供从函数中获取的通用值。有没有办法做到这一点?

我想轻松实现nullables。我需要一个setValue函数,因为我需要将FHasValue赋值为true或false(所以我知道值是否为“nullable”)。在主窗体中,我会调用这样的代码:

var a: Nullable<integer>;
begin

 a := Nullable<integer>.Create(5);
 try

  a.setNull;

  if (not a.hasValue) then
   memo1.lines.add('nullo')
  else
   memo1.lines.add('valore = ' + a.value.toString);

 finally
  a.Free;
 end;

1 个答案:

答案 0 :(得分:5)

而不是

FValue := T;
你的意思是

FValue := val;

你在setter方法中犯了同样的错误,这种错误以类似的方式修复,取而代之的是

Result := T;

Result := FValue;

请注意T类型

现在已经存在许多可以为空的类型的可靠实现,例如Spring有一个。你可以从中汲取灵感,甚至可以按原样使用。