這是因爲泛型功能是在內聯引擎的頂部實現的。適用於內聯函數的相同限制適用於泛型函數。編譯器編寫者只是沒有采取額外的步驟來使錯誤信息專用於泛型而不是內聯函數。
我認爲調用InterlockedIncrement
可能是您的最佳選擇,對於沒有AtomicIncrement
內在的Delphi版本。或者,也可以創建您自己的AtomicIncrement
版本,該版本僅在Delphi不包含它的版本中定義。並且該函數可以用asm編寫。那麼,它顯然必須用asm編寫。
{$IFNDEF AtomicFunctionsAvailable}
function AtomicIncrement(var Target: Integer): Integer;
asm
....
end;
{$ENDIF}
或者作爲@TLama建議,您可以使用TInterlocked
從System.SyncObjs
單位提供的原子操作。
說了這麼多話,我就沒有必要用這種方式干涉內部。無論何時寫入數組,都要調用SetLength(...)
來實現寫入數組的副本。舉例來說,這裏的一對寫入陣列實現一個非常簡單的複製:
unit COWArray;
interface
type
TCOWArray<T> = record
private
FItems: TArray<T>;
function GetLength: Integer;
procedure SetLength(Value: Integer);
function GetItem(Index: Integer): T;
procedure SetItem(Index: Integer; const Value: T);
public
class function New(const Values: array of T): TCOWArray<T>; static;
property Length: Integer read GetLength write SetLength;
property Items[Index: Integer]: T read GetItem write SetItem; default;
end;
implementation
function TCOWArray<T>.GetLength: Integer;
begin
Result := System.Length(FItems);
end;
procedure TCOWArray<T>.SetLength(Value: Integer);
begin
System.SetLength(FItems, Value); // SetLength enforces uniqueness
end;
function TCOWArray<T>.GetItem(Index: Integer): T;
begin
Result := FItems[Index];
end;
procedure TCOWArray<T>.SetItem(Index: Integer; const Value: T);
begin
System.SetLength(FItems, System.Length(FItems)); // SetLength enforces uniqueness
FItems[Index] := Value;
end;
class function TCOWArray<T>.New(const Values: array of T): TCOWArray<T>;
var
i: Integer;
begin
System.SetLength(Result.FItems, System.Length(Values));
for i := 0 to high(Values) do
Result.FItems[i] := Values[i];
end;
end.
也許你應該選擇什麼是你對問題 - 編譯「內聯彙編錯誤」或用於互鎖遞增替代搜索。 – Kromster
很顯然,問題是關於編譯器消息@Krom。有關增量代碼的部分是搶佔題外評論,詢問他爲什麼在第一個地方使用匯編程序而不是使用API。 –
FWIW我不明白你爲什麼想直接干預裁判計數。沒有必要這樣做。 –