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

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 - получается неправильный тип.

У меня тоже не падает.

Странно, теперь и у меня не падает… А IDE перезагрузить я тогда не пробовал.

Этот код генерирует полный бред в IL:

uses u1;
uses u2;

begin
  var a := new t1;
end.
unit u1;

interface

type
  t2 = partial class end;
  t1 = partial class
    public next: t2;
  end;
  
implementation

uses u2;

end.
unit u2;

interface

type
  t1 = partial class end;
  t2 = partial class
//    public next: t1; // если раскомментировать - t2 вообще перестаёт существовать
  end;
  
implementation

uses u1;

end.

И t1 и t2 добавляет по 2 раза, причём у дубля t1 нету ни 1 поля.

Есть ли смысл заливать в issue, или пока рано partial классы насиловать?

Делайте issue. Всё равно partial классы нужны

1 лайк

Так-то это и не должно работать. Все части partial-класса должны находиться в одном пространстве имён.

using System;

namespace ConsoleApp1
{
    namespace A
    {
        partial class Class1
        {

        }
    }

    namespace B
    {
        partial class Class1
        {

        }
    }

    public static class Program
    {
        public static void Main()
        {
            Console.WriteLine(typeof(A.Class1).GetHashCode() == typeof(B.Class1).GetHashCode());
            Console.ReadKey();
        }
    }
}

Это, разумеется, выведет False.

Почему? Это должно работать. У вас два разных класса

1 лайк

В модулях кстати надо это осмыслить. С одной стороны модули - это разные пространства имен. С другой - partial классы нами создавались для дизайнера объектов чтобы действовать в разных модулях.

1 лайк

Зачем нужны модули? Это всё можно было бы легко реализовать в пространствах имён:

Program240.pas:

{$includenamespace Form1.pas}
{$includenamespace Form1Design.pas}
program Project240;

uses System, System.Drawing, System.Windows.Forms;

begin
  System.Windows.Forms.Application.EnableVisualStyles();
  System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
  System.Windows.Forms.Application.Run(new Form1)
end.

Form1.pas:

namespace Project240;

type
  Form1 = partial class(Form)
    public constructor;
    begin
      InitializeComponent;
    end;
  end;

end.

Form1Design.pas:

namespace Project240;

type
  Form1 = partial class(Form)
    private procedure InitializeComponent;
    begin
      self.Text := 'Form1';
    end;
  end;

end.

1 лайк

Тогда у нас пространств имен не было

Loading core… Подключен парсер PascalABC.NET Language Parser v1.2 Подключен парсер Documentation Comments Tag Parser v0.9 PascalABCCompiler.Core v3.4.2.1972 Copyright © 2005-2018 by Ivan Bondarev, Stanislav Mihalkovich OK 44,0025ms Connected parsers: PascalABC.NET (*.pas); Connected conversions: Optimizer; Compiling assembly And.pas… [0][1,1] And.pas: Unexpected symbol ‘’ [1][1,1] And.pas: Found ‘’ but declaration section or begin expected Текст ошибки(или что это),на картинке плохо видно Что делать что бы всё заработало

Скорее всего дело в кодировке файла.

Скиньте .pas файл который так ломается.

Все эти,кроме тех которые не относятся к паскали

Вообще абсолютно любой .pas файл открываешь и такая фигня

Ещё 4 дня назад всё работало,а сейчас нет,хотя я эти файлы дней 30 не открывал и нечего там не менял

Я говорю .pas файлы скиньте а не скриншот.
Хотя вообще - для начала обновитесь:
http://pascalabc.net/ssyilki-dlya-skachivaniya