Не даёт явно преобразовывать значение к типу из шаблона
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