Почему return type void объявлен как struct в .NET?

AFAIK void ничего не означает в языке программирования. Итак, почему в .Net framework объявлено как struct?

using System.Runtime.InteropServices;

namespace System
{
  /// <summary>
  /// Specifies a return value type for a method that does not return a value.
  /// </summary>
  /// <filterpriority>2</filterpriority>
  [ComVisible(true)]
  [Serializable]
  [StructLayout(LayoutKind.Sequential, Size = 1)]
  public struct Void
  {
  }
}

Ответ 1

System.Void - это действительно тип маркера - члены, такие как MethodInfo.ReturnType, должны иметь некоторый способ представления void и System.Void - это способ, которым команда .NET решила это сделать.

Вы не должны использовать его, как обычный тип. Это обходное решение, эффективно - немного похожее на F # Unit type, но не полностью интегрированное в систему типов.

Ответ 2

Дескриптор метода содержит поле для возвращаемого типа метода. Хотя было бы возможно, чтобы это поле было null для функций void, которое требовало бы того кода, который хочет, например, сообщите, что тип возвращаемого метода говорит что-то вроде:

string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null";

а не просто:

string theReturnType = theMethod.ReturnType.ToString();

Достаточно случаев, когда код должен что-то делать с типом возвращаемого метода, который должен иметь значение null для всех случаев, но это будет гораздо больше, чем просто наличие фиктивного типа "null", который может быть возвращен.

Кстати, хотя, насколько я знаю, void - единственный тип, который можно использовать для возвращаемого значения метода, но не имеет другой цели, существуют другие случаи, когда было бы полезно иметь тип, который можно было бы использовать для публичных возвращаемые значения, но не используемые во внешних объявлениях местоположения хранилища, например, при написании свободного интерфейса (если внешнему коду может быть разрешен доступ к элементам biz.boz(3), но он не может сохранить само значение, то в конструкции, подобной biz.boz(3).foo(9).bar(2).build(), метод foo мог бы знать, что он содержал единственную ссылку в любом месте юниверса для объекта, возвращаемого boz(3), и, таким образом, был бы свободен либо мутировать его, либо возвращать новый экземпляр в удобное для него время).