我们用一个 TList<TFunc<Boolean>>
和一些 function ... of object
在它,现在想 Remove()
一些条目再次。但它不起作用,因为显然你很简单 不能 比较这些 reference to ...
可靠的东西。
这是一些测试代码:
program Project1;
{$APPTYPE CONSOLE}
uses
Generics.Defaults,
SysUtils;
type
TFoo = class
strict private
FValue: Boolean;
public
constructor Create();
function Bar(): Boolean;
end;
{ TFoo }
function TFoo.Bar: Boolean;
begin
Result := FValue;
end;
constructor TFoo.Create;
begin
inherited;
FValue := Boolean(Random(1));
end;
function IsEqual(i1, i2: TFunc<Boolean>): Boolean;
begin
Result := TEqualityComparer<TFunc<Boolean>>.Default().Equals(i1, i2);
end;
var
s: string;
foo: TFoo;
Fkt1, Fkt2: TFunc<Boolean>;
begin
try
Foo := TFoo.Create();
WriteLn(IsEqual(Foo.Bar, Foo.Bar)); // FALSE (1)
WriteLn(IsEqual(Foo.Bar, TFoo.Create().Bar)); // FALSE (2)
Fkt1 := function(): Boolean begin Result := False; end;
Fkt2 := Fkt1;
WriteLn(IsEqual(Fkt1, Fkt2)); // TRUE (3)
Fkt2 := function(): Boolean begin Result := False; end;
WriteLn(IsEqual(Fkt1, Fkt2)); // FALSE (4)
Fkt2 := function(): Boolean begin Result := True; end;
WriteLn(IsEqual(Fkt1, Fkt2)); // FALSE (5)
FreeAndNil(Foo);
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
Readln(s);
end.
我们虚拟地尝试过 一切,=运算符,比较指针等。
我们甚至尝试了一些非常讨厌的事情,比如反复投射 PPointer
并取消引用,直到我们得到相同的值,但这当然不会产生令人满意的结果=)。
- 情况(2),(4)和(5)都可以,因为实际上存在不同的功能。
- 案例(3)也是微不足道的。
- 案例(1)是我们想要检测的,这是我们无法开展的工作。
我担心,Delphi会隐秘地创建两个不同的匿名函数来转发调用 Foo.Bar
。在这种情况下,我们将完全无能为力,除非我们想要躲过未知记忆的泥沼......而且,我们不会。