Реализация собственных типов данных в C # без перечисления?

Основное различие между встроенными типами данных и пользовательскими типами данных заключается в том, что: встроенные типы данных могут принимать литеральные значения (значения, вставленные непосредственно в код, этот процесс также называется жестким кодированием).

Таким образом, возможно создать пользовательский тип данных, такой же как логический, который принимает три значения:
да / нет / возможно без использования перечислений.

такой как следующий код:

MyCustomBoolean a = maybe;

Я задал вопрос выше, потому что я хочу понять, что встроенные типы данных в C # проинструктированы в Core Language (например, C ++ int, char …) или нет?

—Обновить—

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

Я знаю, что, например, строка является псевдонимом System.String, но работает ли чистая строка в C # без System.String?

0

Решение

Нет способов сделать это именно так, как вы просили. Однако вы можете создать постоянные поля в C #, который может достичь этого результата (именованные значения), но только с интегральные типы или строки — другими словами, вещи, которые вы уже можете использовать для констант времени компиляции. Это может быть особенно полезно в противном случае Волшебные Ценности.

public const string Maybe = "Maybe";
public const int Maybe = 0;

Один из способов обойти это, хотя он не будет использоваться в качестве истинной константы, — это инициализировать static только для чтения поля или свойства. Например

public static readonly MyCustomBoolean Maybe { get { return new MycustomBoolean(); } }
public static MyCustomBoolean Maybe = new MyCustomBoolean();
2

Другие решения

Для этого конкретного случая вы можете использовать обнуляемый тип bool.
С типичными операциями, такими как:

bool? b = null
if (b.HasValue)
if (b.Value)
b = true

Где может быть ноль, или с HasValue == false,

0

Литералы являются особенностью языка C #. Вы не можете создавать новые литералы.

Возможно, вас заинтересует другой язык программирования, например Nemerle, который позволяет создавать пользовательские литералы, такие как этот XML-литерал:
https://github.com/rsdn/nemerle/wiki/XML-literals

Перечисления и константы обычно заполняют пустоту для C #. Для более сложных структур вы часто видите некоторую разновидность свободного API.

Конечно, мы видим, что отсутствие этой функции в C # означало, что обеспечение естественного способа определения запросов означало изменение спецификации языка C # для поддержки LINQ. Если бы у C # были такие же возможности метапрограммирования, как у Nemerle, они могли бы достичь тех же целей, что и LINQ, без изменения синтаксиса языка.

0
По вопросам рекламы [email protected]