Помощь новичкам

Но эта штука работает быстрее.

Быстрее, чем в MS DOS, ни одна система под Windows работать не может, разве что приложение будет хотеть памяти больше, чем MS DOS дает.

А ЧТО на ней мне запускать?

ТурбоПаскаль. ФриПаскаль… откуда я знаю? )))

А .NET? Портировать будем? Сравнивать то в одном месте проще )))

А что за .NET в Windows 98? Там не пойдет PascalABC.NET он нигде не пойдет, младше WinXP, да и там с ограничениями.

А кто ж его знает. Надо пробовать.

Да можно попробовать, например, и под трамвай лечь, чтобы проверить шансы выжить. Но нужно ли? Разработчики очертили уровень .NET-библиотек, с которыми возможна работа.

А это здесь причём? П.С. Вопрос отпал сам собой. На 95 не пойдёт ни одна версия .NET.

Ну я про это и пишу

function P1<T>(x: T; y: byte) := 1;

function P1<T>(x, y: T) := 2;

begin
  Writeln(P1(0, 0));
end.

По какому принципу выбирается подходящая подпрограмма-функция? Почему выбирается именно вторая?

Потому что литеральные константы, изображающие целые числа, приводятся к integer

Точнее выбирается та подпрограмма, для параметров которой требуется произвести наименьшее количество неявных преобразований?

Нет, просто первая потребовала бы сделать недопустимое приведение типа integer -> byte

Если оно недопустимое, то почему здесь не выдается ошибка:

begin
  var x: integer := 256;
  var y: byte := x; // Разве можно производить неявно сужающие преобразования?
  Writeln(y);
end.

?

В C#:

using System;

class MainClass
{
	public static void Main (string[] args)
	{
		int x = 256;
		byte y = x; // Как и ожидалось - неявное сужающее преобразование недопустимо, так как это может повлечь за собой потерю данных.
		Console.WriteLine(y);
	}
}

этот код выдаст:

main.cs(8,13): error CS0266: Cannot implicitly convert type int' tobyte’. An explicit conversion exists (are you missing a cast?)

.

А по моему должно выводить несколько подпрограмм могут быть вызваны… Потому что приведений одинаковое кол-во. Обычно выбирает подпрограмму где меньше приведений. Ну я лучше дождусь ответа @Admin.

1 лайк

при инстанцировании типа приведение вообще запрещено.

Хотя, возможно я неправ, и этот запрет только для перегрузки.

using System;

class MainClass
{
	public static int F<T>(T x, byte y) => 1;

	public static int F<T>(T x, T y) => 2;

	public static void Main (string[] args)
	{
		Console.WriteLine(F(0, 0));
	}
}

Выведет:

2

.

Нет, вы перепутали. Это когда тип T приходится приводить в описании - оно запрещено. А тут переменную не_шаблонного типа приводят, так что всё нормально.

Литеральные константы, изображающие числа, приводятся к integer. В этом легко убедиться, посмотрев тип при присваивании var c:=61;

Но если запретить, к примеру, сужающее преобразование integer ->byte, что должно происходить при попытке получить символ с кодом 61 посредством функции OrdAnsi( c ), принимающей аргумент типа byte или традиционной Ord( c ), принимающей word?

Еще в Паскале Н.Вирта Ord(61) - корректная запись и рушить синтаксис, теряя совместимость никто не будет.