由于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;
答案 0 :(得分:5)
而不是
FValue := T;
你的意思是
FValue := val;
你在setter方法中犯了同样的错误,这种错误以类似的方式修复,取而代之的是
Result := T;
带
Result := FValue;
请注意T
是类型。
现在已经存在许多可以为空的类型的可靠实现,例如Spring有一个。你可以从中汲取灵感,甚至可以按原样使用。