Не путайте operator explicit и as. .Cast выполняет именно as.
Разница в том - что as работает для классов-наследников друг-друга.
А operator explicit это обычная функция, посыпанная тонким слоем сахарка (то что её можно вызывать через real(i)). Она может быть перегружена (вроде даже экстенш-методом), но поэтому же - компилятор должно явно указать в IL коде какая перегрузка вызывается. Поэтому шаблонную функцию используя его не напишешь.
P.S. Да, вот через extensionmethod:
function operator explicit(self: System.Type): integer; extensionmethod;
begin
Result := self.GetHashCode;
end;
begin
var t := typeof(object);
integer(t).Print;
end.
Я не разбираюсь в классах, пока еще, просто взял пример из справки по Cast, там один в один, добавил вывод и оно выдало ошибку. То есть вывести через Print или Write эти элементы последовательности(?) нельзя. А как их вывести тогда, ну и написали бы в справке вывод, чтоб понятно было. Мне вот не понятно.
Пока Вы последовательность определили, проблем не возникает, потому что определение последовательности путем присваивания, в силу того, что она не хранится - это лишь описание. Но как только происходит обращение к первому элементу последовательности, начинается выполнение кода. Вот тут-то все и начинается…
Недавно запуск pabcnetcclear.exe с такой строкой в качестве аргументов: $'"{fname}.pas" "" "Debug=0"'
Перестал работать. Пишет:
Error in argument Debug=0
Command line cannot contain any arguments after filename 'C:\1Сергей\Мои программы\SAC\src\Test.pas' and outdirname ''
Так а куда правильно Debug=0 засовывать чтоб откомпилировать .pas файл в режиме без дебага?
P.S. @Admin ввобще вы мне тут сказали использовать такой аргумент, но мне кажется что он и до того как компилятор стал на него ругаться - не работал. Просто раньше игнорировался.
Я немного туплю с утра пораньше… Какая тут логика? Вы имеете в виду создать отдельную тему с предложениями как улучшить, чтоб консольные компиляторы были юзабельны не только из IDE?
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();
}
}
}