Просто для тестирования. И почему должна вылетать ошибка, если я просто не использую T?
namespace Test
{
public class A<T>
{
public static int l;
}
class Program
{
static void Main(string[] args)
{
A<int>.l = 1;
}
}
}
Например, компилируется, даже если T не используется.
Почему ошибка - это к разработчикам. Возможно компилятор не понимает, куда он должен производить инстанцирование этого Вашего integer.
Вы периодически забываете, что это Паскаль, а не С++ и не надо из него С++ сделать пытаться, как не надо пытаться добиться от него, чтобы всякая, простите, фигня, которая в С++ допустима, была допустима и тут. В данном случае это как если Вы по дорогу домой заодно подберете урну с мусором, которая Вам сто лет не снилась, и будете с нею в обнимку до дверей квартиры идти, а потом бросите.
Я уважаю разработчиков как людей, но хотелось бы чтобы компилятор изменился в лучшую сторону, а то получается, что даже верный код (синтаксически) не компилируется.
Да, кстати, в коде был C#.
А что, этот код нельзя в С++ набрать?
Я не спорю, что можно, просто я в Visual Studio 2017 проверял.
Кстати, это тоже не компилируется:
type
a<t>=class
public class l: T;
end;
begin
a&<integer>.l := 9;
end.
Тогда указывайте, что это С#, а то получается, что пишете код, я на него ссылаюсь, а Вы начинаете рассказывать, что “язык не тот”.
Хорошо, учту на будущее.
Всё правильно он сделал, он оставил только то что нужно для вызова ошибки. T
может использоваться для элементов класса, но они не нужны для вызова ошибки.
А ошибок компиляции даже в неадекватном коде не должно быть.
Вы задали вопрос, посему ошибка. Я Вам на него ответил, как смог и указал причину. Теперь Вы начинаете меня спрашивать, почему Ваш код не работает. Я Вам попытался сказать, что тестирование компилятора на каких-то заумных конструкциях, которые мне ни разу в жизни не понадобились (и не знаю, зачем могли бы понадобиться) мне не шибко интересно. У меня другие проблемы, более земные.
Обнаружил странную вещь и не пойму - это ошибка или особенность реализации?
begin
var f:file of integer;
Rewrite(f,'probe.bin');
f.Seek(1000);
f.Truncate;
f.Close;
Reset(f,'probe.bin');
Writeln('FileSize=',f.FileSize);
f.Close
end.
Известно, что Seek(n) перемещает указатель на запись с номером n (отсчет от 0). Нигде я не нашел указаний на то, что должно произойти, если установить указатель за пределы файла. В приведенном примере создается пустой файл. Далее указатель перемещается на позицию перед записью с номером 1000, т.е. смещается на 4х1000=4000 байт от начала файла. Того, у которого пока нулевая длина (!) и ноль записей. Truncate усекает остальные (!) байты, файл закрываем и… получаем файл длиной 4000 байт, заполненный высококачественными двоичными нулями.
Если открыть существующий файл по Reset и с помощью Seek отправить указатель “в туманные дали”, то и в этом случае Truncate позволит эти самые дали сделать родными.
С одной стороны, мне нравится такой способ создавать пустые файлы “левой задней ногой”. А с другой, иногда хочется, чтобы Seek(f,ДалекоДалеко) становился на Eof в соответствии с Filesize. Может, тут как со срезами, нужны два Seek - мягкий и суровый? Ну или один, но с опцией…
@Admin: GitHub пока решил не засорять этими размышлизмами.
@Admin, почему это не форматируется даже (а тем более не компилируется):
begin
writeln(typeof(List<>));
end.
? В то время, как я ожидал, увидеть: System.Collections.Generic.List’1[T]. В C# работает и выводит что требуется:
namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(typeof(List<>));
}
}
}
Да, это баг:
У нас не такая мощная система типов как в C#. Для нас это не тип
А что для Вас является типом?
Особенность реализации Если Вы сикаете, а потом пишете или усекаете, то файл расширяется
@Amdin, почему не компилируется при:
type
T1<T> = record
X: T;
end;
var
A: T1<string>;
begin
with A do
X := 'str';
end.
? Ошибка: Program1.pas(11) : Нельзя преобразовать тип string к T.
Ведущий разработчик вообще считает, что использование with в PABC 3.x - анахронизм на грани фола. Об этом уже писалось.
Можно запретить использовать шаблоны с with
но “нельзя преобразовать к T” это не правильно.