Ошибки компилятора PascalABC.Net

Не путайте operator explicit и as. .Cast выполняет именно as.

Разница в том - что as работает для классов-наследников друг-друга.

А operator explicit это обычная функция, посыпанная тонким слоем сахарка (то что её можно вызывать через real(i)). Она может быть перегружена (вроде даже экстенш-методом), но поэтому же - компилятор должно явно указать в IL коде какая перегрузка вызывается. Поэтому шаблонную функцию используя его не напишешь.

P.S. Да, вот через extensionmethod:

function operator explicit(self: System.Type): integer; extensionmethod;
begin
  Result := self.GetHashCode;
end;

begin
  var t := typeof(object);
  integer(t).Print;
end.

Я не разбираюсь в классах, пока еще, просто взял пример из справки по Cast, там один в один, добавил вывод и оно выдало ошибку. То есть вывести через Print или Write эти элементы последовательности(?) нельзя. А как их вывести тогда, ну и написали бы в справке вывод, чтоб понятно было. Мне вот не понятно.

Пока Вы последовательность определили, проблем не возникает, потому что определение последовательности путем присваивания, в силу того, что она не хранится - это лишь описание. Но как только происходит обращение к первому элементу последовательности, начинается выполнение кода. Вот тут-то все и начинается…

Где именно? Это ошибка и должно быть исправлено.

P.S. Нашёл.

type
  ver_t = record Major, Minor: integer; end;
  LibInfo = class
    public const version: ver_t = (Major = 1, Minor = 0); 
  end;

begin end. 

Константа класса может иметь значение только примитивного типа

Зачем это ограничение? Синтаксически эту конструкцию явно принимает.

begin
  System.Linq.Enumerable.Aggregate(Seq(0),(a,b)->a);
end.

Ошибка состоит в том что даёт вызывать так экстеншн-метод, или в том что анализатор кода не показывает первый параметр?

Дамы и Господа! Случилась такая ошибка при запуске PascalABC, светлым умам заранее благодарен! 2omd093dopsj|690x387

Что это? Не кликается…

И в любом случае, приложите больше данных, к примеру код.
Его выделять надо так:

```
Код
```

Знак ` находится за Ё в англ раскладке.

Нельзя вызвать методы begin/end, компилятор ругается. Для примера OpenTK.Graphics.OpenGL.GL.End(); - фигвам. Обойти это как-то можно? :slight_smile:

Да, ключевые слова надо экранировать:
OpenTK.Graphics.OpenGL.GL.&End

1 лайк

Недавно запуск pabcnetcclear.exe с такой строкой в качестве аргументов:
$'"{fname}.pas" "" "Debug=0"'
Перестал работать. Пишет:

Error in argument Debug=0
Command line cannot contain any arguments after filename 'C:\1Сергей\Мои программы\SAC\src\Test.pas' and outdirname ''

Так а куда правильно Debug=0 засовывать чтоб откомпилировать .pas файл в режиме без дебага?

P.S. @Admin ввобще вы мне тут сказали использовать такой аргумент, но мне кажется что он и до того как компилятор стал на него ругаться - не работал. Просто раньше игнорировался.

Мы переписали pabcnetcclear.exe Запустите его без аргументов - он скажет вам параметры командной строки.

И - можно открывать тред по консольным компиляторам - что хотелось бы, потому что они писались только с расчетом простейшего использования в оболочке

1 лайк

Я немного туплю с утра пораньше… Какая тут логика? Вы имеете в виду создать отдельную тему с предложениями как улучшить, чтоб консольные компиляторы были юзабельны не только из IDE?

@Admin, пожалуйста, дофиксите наконец #1981, вы ведь в #1957 уже придумали как исправлять такое. Очень мешает.

Это сложно всё, на это уходят дни. Там нет аналогии.

type
  t1 = class
    
    public static procedure p1;
    begin
    end;
    
  end;

begin
  try
    var ad := System.AppDomain.CreateDomain('domain 2');
    ad.DoCallBack(t1.p1);
  except
    on e: Exception do writeln(e);
  end;
end.

Этот код падает с TypeLoadException. И вроде ведь несколько месяцев назад работало.

Посмотрел как выглядит t1 в .exe и написал такой же тип в C# - всё работает без ошибок:


using System;

namespace Test1
{
	public class t1
	{
	    public void Init()
	    {
	    }
	    
		public static void p1()
		{
		}

	    public t1()
	    {
	    	this.Init();
	    }
	}
	
	static class Program
	{
		public static void Main(string[] args)
		{
			try {
				var ad = AppDomain.CreateDomain("domain 2");
				ad.DoCallBack(t1.p1);
			} catch (Exception e) {
				Console.WriteLine(e);
			}
			Console.ReadLine();
		}
	}
}

у меня не падает

А разве это ошибка? Там действительно два преобразования типов

Я уже объяснял в #1957, если применить operator implicit - получается неправильный тип.