編輯,澄清這個問題,因爲我簡化太多,從而消除了我實際上正面臨爲什麼我不能在方法體之外聲明一個通用的匿名方法?
這個問題我有在長身體的實現委託。
因此,我不想在我使用它的函數中聲明它。
type
TTaskDelegate<A, B> = reference to procedure(const Data: IData);
//-----------^^^^^^ note the type parameters here
//-But no type parameters here---------------------------^^^^^^
的委託聲明一樣,這樣我可以將其存儲在一個看起來像記錄:
TMultiDelegate = record
strict private
fAA: TTaskDelegate<TOmniValue, TOmniValue>;
fAB: TTaskDelegate<TOmniValue, IOmniBlockingCollection>;
fBA: TTaskDelegate<IOmniBlockingCollection, TOmniValue>;
fBB: TTaskDelegate<IOmniBlockingCollection, IOmniBlockingCollection>;
fSimple: TSimpleTaskDelegate;
fOutputCount: Integer;
function GetDelegateType: TDelegateType;
public
constructor Init(AA: TTaskDelegate<TOmniValue, TOmniValue>; const OutputCount: integer = 1); overload;
constructor Init(AB: TTaskDelegate<TOmniValue, IOmniBlockingCollection>; const OutputCount: integer = 1); overload;
.....
類型參數也起到提醒的通用程序的實現者是什麼輸入和輸出類型是。
因爲類型參數在方法頭的其餘部分中沒有重複,所以在聲明函數時必須保留它們。
因此Stefan的答案不起作用。
只是聲明它作爲單位常量(或單位變量)不起作用。
由於其通用簽名,將其聲明爲單位過程也不起作用。
下面的代碼無法編譯:
樣品A
const
Test: integer = 0;
const
DoesNotCompile: TTaskDelegate<TOmniValue, TOmniValue> =
procedure(const Data: IData)
begin
//Do stuff
end;
E2026 Constant expression expected
//This variant will not compile either.
procedure DoStuff<TOmniValue, TOmniValue>(const Data: IData)
begin
//DoStuff
end;
當我把它包在它的工作的功能。
樣品B
function ListSplitterDelegate: TTaskDelegate<TOmniValue, TOmniValue>;
begin
Result:=
procedure(const Data: IData)
begin
//Do stuff
end;
end;
感覺有點畫蛇添足這種方式來做到這一點。
有沒有辦法避免必須將通用匿名函數包裝在另一個函數中?
在單元的初始化部分直接分配它不是一個好主意,因爲這會導致內存泄漏報告。如果你想這樣做,你應該把它放到一個例程中,並在初始化部分調用它。 –
@StefanGlienke有很多原因,這不是一個好主意。我只是用它來證明需要在運行時創建匿名方法。另外,將它放入常規會使我們回到使用Johan的'ListSplitterDelegate'的(更好的)解決方案的複雜程度,所以根本沒有理由使用上述方法。 –