37 lines
1.2 KiB
ObjectPascal
37 lines
1.2 KiB
ObjectPascal
|
|
var s: string;
|
|||
|
|
type
|
|||
|
|
// Обязательно разделить откуда берутся типы лямбды:
|
|||
|
|
// TInput должно браться из шаблона класса (GenericContainer)
|
|||
|
|
// TResult - из шаблона метода (TakeLambda)
|
|||
|
|
GenericContainer<TInput> = class
|
|||
|
|
|
|||
|
|
// Не обязательно статический метод
|
|||
|
|
static procedure TakeLambda<TResult>(lambda: TInput->TResult);
|
|||
|
|
begin
|
|||
|
|
lambda(default(TInput));
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
procedure PErr<T>;
|
|||
|
|
begin
|
|||
|
|
|
|||
|
|
// Обязательно в качестве TInput указать не конкретный тип,
|
|||
|
|
// а использовать тип из шаблона PErr
|
|||
|
|
GenericContainer&<T>.TakeLambda(l->
|
|||
|
|
begin
|
|||
|
|
// Обязательно вычислять тип шаблона TakeLambda из тела лямбды
|
|||
|
|
// Если вызвать TakeLambda&<integer> - не воспроизводится
|
|||
|
|
Result := 0;
|
|||
|
|
// Обязательно присвоить чему то результат
|
|||
|
|
//Ошибка: ToString не объявлен в типе
|
|||
|
|
var v := l.ToString;
|
|||
|
|
s := v;
|
|||
|
|
end);
|
|||
|
|
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
begin
|
|||
|
|
PErr&<integer>;
|
|||
|
|
assert(s = '0');
|
|||
|
|
end.
|