pascalabcnet / pascalabcnet

The new generation Pascal programming language for .NET

Home Page:http://pascalabc.net

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Не даёт явно преобразовывать значение к типу из шаблона

SunSerega opened this issue · comments

##
procedure p1<T>(o: T);
begin
  Println(T(1 as object)); // DarkBlue
  Println(integer(o as object)); // 12
  //Ошибка: Невозможно явно преобразовать тип integer к типу T
  Println(T(1));
  //Ошибка: Невозможно явно преобразовать тип T к типу integer
  Println(integer(o));
end;

p1(System.ConsoleColor.Red);

Если к T нельзя преобразовывать так, как если подставить real - во время выполнения вылетит System.InvalidCastException.
А во время компиляции неправильно проверять это для типов из шаблона. Из всех операций - явное преобразование и as как раз должны работать всегда когда CLR позволяет при выполнении.

В частности, я это дело в такой подпрограмме использую:

function ReadEnum<T>(self: BinReader): T; extensionmethod;
  where T: System.Enum, record;
begin
  {$ifdef DEBUG}
  if typeof(T).GetEnumUnderlyingType <> typeof(Int32) then
    raise new NotSupportedException;
  {$endif DEBUG}
  Result := T(self.ReadInt32() as object);
end;

Глупости какие-то. Это не должно компилироваться. В C# не компилируется

Точно, в C# тоже только через object, хотя в итоге этот боксинг не эффективный...
Можно так обойти: https://stackoverflow.com/a/23391746/9618919