А что значит
?.
?
А что значит
?.
?
Но там разве сказано явно, что писать ИмяОбобщения<шаблоннные_параметры>(выражение) запрещено?
На сколько я понял что TMy<T>
воспринимает как TMy< T > (то_из_чего_преобразуется)
, то есть его раскладывает сначала на сравнение оператором < имени шаблона и имени класса T, а затем получившееся <errortype>
(то что возвращает оператор сравнения) сравнивает с тем из чего вы преобразуете (то есть 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.
По крайней мере компилируется
А, да, мы это оказывается доделали. Когда-то в преобразовании типов можно было только имена
@Admin, почему при таком неверном синтаксически коде IntelliSence мне показывает: ? Разве не должен ли там стоять символ &?
Ну да, должен, но именно в этом случае кажись только компиляция не проходит, а анализатор кода в порядке (хотя не понятно как то вышло). Ну и пусть удобно ведь. Это не единственный случай когда анализатор кода продолжает подсказывать в ошибочном коде, к примеру это признано фичей:
Анализатор кода написан не по полной грамматике PascalABC.NET, а по упрощённой. В частности, отдельно разбирается выражение до точки. И у нас он не может предусмотреть все фичи языка. Если бы мог, то нуждался бы в существенно более долгом алгоритме - после нажатия точки мы бы ждали секунды три.
Версия 3.2 1427 при форматировании кода:
function Dispose(self: integer); extensionmethod := self + 1;
begin
end.
получается:
function Dispose(self: integer); extensionmethod; extensionmethod :=self + 1;
begin
end.
Для чего писать сообщение об ошибках в версии ГОДИЧНОЙ давности? С тех пор столько уже ошибок выявлено (и, как водится, новые добавлены)… Проверять надо всегда на самой свежей версии. Сейчас актуальна версия 3.3.5, сборка 1650 от 01.04.2018.
Проверял не дома - поэтому проверял на том что стояло. А в последней версии - такой ошибки нет.
Видите, фактически ни о чем написали.
Согласен. То что ее нет в новой версии - радует.
Почему при форматировании кода вместо:
namespace TestProjectPascal;
type
IPair = interface
property X: real;
property Y: real;
end;
type
TPoint = record(IPair)
private
_x, _y: real;
public
property X: real read _x write _x;
property Y: real read _y write _y;
constructor(x_, y_: real);
begin
(X, Y) := (x_, y_);
end;
function ToString(): string; override := $'TPoint: (X: {X}, Y: {Y})';
end;
end.
на выходе получается это:
libraryTestProjectPascal
type
IPair = interface
property X: real;
property Y: real;
end;
type
TPoint = record(IPair)
private
_x, _y: real;
public
property X: real read _x write _x;
property Y: real read _y write _y;
constructor(x_, y_: real);
begin
(X, Y) := (x_, y_);
end;
function ToString(): string; override := $'TPoint: (X: {X}, Y: {Y})';
end;
end.
? P.S. Это проявилось при работе с проектом.
И второй вопрос:
Почему когда сам набираешь текст при переименовании все нормально, но когда пытаешься вставить какое то слово в название то получаешь что-то на подобии этого?Потому что фича (namespace) сырая, пусть сначала анализатор кода сделают, глядишь - и это починится.
Приведите пример как было, что куда вставляли и что вышло, при чём не скриншотом а кодом. Архивом если это только в проектах Windows.Forms
наблюдается.
Вот архив: Пример.rar (40,2 КБ). Это изначально что было. Попробуйте переименовать какой нибудь из модулей, например, но не набирая название новое, а вставляя какое-нибудь слово в название.
У меня ZipFile
не показывает в System.IO.Compression
, у кого то ещё наблюдается такая неполадка?
{$reference System.IO.Compression.FileSystem.dll}
begin
System.IO.Compression.ZipFile.OpenRead('');//компилируется
System.IO.Compression.
end.
Если назвать файл именем, например, PABCExtensions.pas, а затем написать:
begin
Writeln('Hello world');
end.
, то не выполняется и не компилируется с неадекватным сообщением об ошибке:
Неизвестное имя 'Writeln'
. Почему бы не выдавать сообщение о том, что это недопустимое имя?
type
t1 = abstract sealed class end;
begin end.
Program1.pas(2) : Абстрактный класс не может иметь атрибут sealed
Приплыли… С чего это вдруг? Так ведь часто делают, взять только System.Math
…