Так даже вся программа откомпилируется, но это не симметрично => уродливо, кроме того - не работает если оба интерфейса - шаблоны. А как для I1.f1 так же сделать?
function I1.f1: T := a;
Program1.pas(14) : Количество шаблонных параметров типа I1<T> должно равняться 1
function I1<T>.f1: T := a;
Program1.pas(9) : Класс C1<T> не реализует метод f1:T интерфейса I1<T>
И правда, интересный вопрос. Ну, #1, допустим не должно работать потому что:
type
I1<T>=interface end;
C1<T1, T2>=class(I1<T1>, I1<T2>)
end;
begin end.
В таком случае надо явно указать к какому из этих 2 интерфейсов относится функция.
А вот последнее не понятно, @Admin можете дать чёткое определение работе &? Оно только для функций должно работать? У меня вроде получилось недавно запихнуть его перед спецификатором шаблона класса и оно ничего не сделало, это ошибка?
type
TBase = abstract class
public
procedure Print() := Write(ToString());
procedure Println() := Writeln(ToString());
end;
TDerived = class(TBase)
public
Value: integer;
function ToString(): string; override := $'TDerived: Value = {Value}';
end;
begin
var A := new TDerived();
A.Value := 1;
A.Println();
end.
Выводится:
TDerived: Value = 1
Но если заменю на:
function ToString() := $'TDerived: Value = {Value}';
type
TMy<T> = class(System.ICloneable)
public
Value: T;
constructor(value_: T);
begin
Value := value_;
end;
function Clone(): object := new TMy<T>(Value);
function CloneAs() := TMy<T>(Clone());
end;
begin
end.
Потому что в C языках override ставить необязательно, его используют чтоб компилятор подсказывал, вдруг чего не так. А в паскале если вы его не поставили - значит эта функция не является частью цепочки.
type t1<T> = class end;
procedure p1<T>(self:t1<T>;a:T); extensionmethod := exit;
begin
var a := new t1<byte>;
a.p1(5);//Generic-функция p1 не может быть вызвана с данным набором фактических параметров
end.
Но ведь 5 можно неявно преобразовать к byte, и если написать p1&<byte> - его таки преобразовывает. Это ошибка?
И ещё, то что ?. в глобальных выражениях падает есть на гитхабе, а то что оно не форматируется даже в блоке имеет смысл туда добавлять?
begin
var a:=new byte[0];
var b := a?.Max;
end.
Компилируется нормально, но форматирование выдаёт:
System.NotImplementedException: Метод или операция не реализована.
в CodeFormatters.CodeFormatter.DefaultVisit(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.visit(var_def_statement _var_def_statement)
в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.visit(statement_list _statement_list)
в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.visit(program_module _program_module)
в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
в CodeFormatters.CodeFormatter.FormatTree(String Text, compilation_unit cu, Int32 cursor_line, Int32 cursor_col)
в VisualPascalABC.CodeFormattingAction.Execute(TextArea textArea)
в System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
в System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
в System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
в System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
в System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ToolStrip.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)