Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Внутренняя ошибка при вызове конструктора для делегата #1552

Closed
SunSerega opened this issue Nov 30, 2018 · 10 comments
Labels

Comments

@SunSerega
Copy link
Contributor

begin
  new System.Action(
    nil,
    System.IntPtr.Zero
  );
end.
() : Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :'System.Exception: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
   в PascalABCCompiler.NETGenerator.ILConverter.visit(ICompiledConstructorCall value)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertBody(IStatementNode body)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionBody(ICommonFunctionNode func)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionsBodies(ICommonFunctionNode[] funcs)
   в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles)
   в PascalABCCompiler.Compiler.Compile()'
@SunSerega
Copy link
Contributor Author

В C#, вроде, конструкторы делегатов принимают не ссылку на объект и дескриптор, а другой делегат.
Сейчас попытка сделать то же самое - даёт ошибку, неправильное кол-во параметров.

@miks1965 miks1965 added the bug label Nov 30, 2018
@miks1965
Copy link
Contributor

miks1965 commented Dec 7, 2018

Вообще надо запретить конструкторы делегатов

@SunSerega
Copy link
Contributor Author

А что в них такого?

@SunSerega
Copy link
Contributor Author

SunSerega commented Dec 7, 2018

Ну да, вот в C# так работает:

using System;

class Program
{
    static void p1() { }
    static void Main()
    {
        var a = new Action(p1);
    }

}

@miks1965
Copy link
Contributor

miks1965 commented Dec 7, 2018

Нет такого конструктора у делегатов. Посмотрите отражением. То, что показывает C#, - это призрак

@SunSerega
Copy link
Contributor Author

SunSerega commented Dec 7, 2018

А, C# его похоже оператором explicit заменяет... Но, да, не стоит добавлять, в C# при использовании этого призрачного конструктора без присвоения результата переменной - показывает ошибку, как будто там оператор explicit)).

@SunSerega
Copy link
Contributor Author

Кстати, это вы для компилятора запретили, а анализатор кода? Или та строчка сразу на оба влияет?

@miks1965
Copy link
Contributor

miks1965 commented Dec 7, 2018

Нет. Анализатор кода разрешает, потому что такой конструктор есть. Компилятор запрещает, потому что, хотя и есть, но вызывать нельзя

@SunSerega
Copy link
Contributor Author

Так он всё же есть или нет?

#1552 (comment)

Нет такого конструктора у делегатов

#1552 (comment)

потому что такой конструктор есть

@miks1965
Copy link
Contributor

miks1965 commented Dec 7, 2018

Такого нет

var a = new Action(p1);

Такой есть

new System.Action(
    nil,
    System.IntPtr.Zero
  );

Только падает он

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants