Совместимость типов делегатов

Как определяется какие типы делегатов совместимы? К примеру, почему данный код валиден?

begin
  var act1: Action0 := procedure() -> exit; 
  var act2: procedure := act; // Почему так можно?
end.

В С#:

using System;

namespace ConsoleApp1
{
	public delegate void MyAction();
	
    class Program
    {
    	public static Action action;
    	
        static void Main(string[] args)
        {
        	MyAction action2 = () => Console.WriteLine();
        	action = action2;
        }
    }
}

выдаст ошибку компиляции:

Неявное преобразование типа “ConsoleApp1.MyAction” в “System.Action” невозможно (CS0029) - C:\Users\Admin\Documents\SharpDevelop Projects\Test1\Test1\Program.cs:23,20

.

C# более жёсткий в плане преобразования типов.

Откровенно, это мне в нём и нравится.

А как в C# решается проблема когда тип надо преобразовать всё же? Неужели только в лямбду оборачивать?

Мне тоже. Отчасти это позволяет экономить память.

Явные преобразования.