C# 16 превращает unsafe в контракт для вызывающего кода
C# 16 переосмысливает ключевое слово unsafe так, что оно передаёт обязательство вызывающему коду, а не молча открывает unsafe-контекст, и теперь внутренние блоки unsafe обязательны.
1 статья