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

Ошибка в типе возвращаемого методом класса результата #471

Closed
AlexRnD61 opened this issue Aug 24, 2017 · 3 comments

Comments

@AlexRnD61
Copy link

type
  MinHJ=class

  function F(a:integer:=1; b:integer:=2):array of integer;
  begin
    Result:=Arr(a,b);
  end;
  
end;

function G(a:integer:=1; b:integer:=2):array of integer;
  begin
    Result:=Arr(a,b);
  end;

begin
  var oL:=new MinHJ;
  var r:=oL.F();
  Writeln('F()-> ',r.GetType);
  var s:=oL.F;
  Writeln('F  -> ',s.GetType);
  // s.Println выдает, как следствие, ошибку
  
  // а так все работает
  var u:=G();
  Writeln('G()-> ',u.GetType);
  var v:=G;
  Writeln('G  -> ',v.GetType);
  v.Println
end.

Результат работы:

F()-> System.Int32[]
F  -> Program1.$delegate0
G()-> System.Int32[]
G  -> System.Int32[]
1 2

Ошибки не будет, если параметр в функции F один.

@miks1965
Copy link
Contributor

Это извечная проблема. Если f - функция без параметров, то как трактовать

var v := f;

Я уже не помню, какое решение принимали мы. Мне кажется, мы приняли решение, что f здесь - это вызов функции, но не везде переделали.

В случае же

function f := 1;

begin
  var v: ()->integer := f;
  System.Console.WriteLine(v.GetType);
  Print(v.Invoke());
end.

тип должен быть делегатом, и это правильно - и это так и есть.

Вывод - для вызова методов мы это не исправили

@AlexRnD61
Copy link
Author

AlexRnD61 commented Aug 25, 2017

А как можно еще трактовать var y:=f, если объект f описан, как функция и не описан как либо еще? К тому же f в данном случае - функция с параметрами, только мы их не указали, поскольку устраивают значения по умолчанию.

@miks1965
Copy link
Contributor

Есть две трактовки. Первая - вызов функции. Вторая - указатель на функцию. Мы считаем, что в этом случае следует отдавать предпочтение вызову функции. Для указателя тип f надо описывать явно.

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

No branches or pull requests

2 participants