В Haskell существует два способа предоставления псевдонима для типов: type
и newtype
. type
обеспечивает синоним типа, что означает синоним рассматривается проверки типов, как точно так же, как и тип исходного:Что такое C#, эквивалентный новому типу Haskell?
type UserId = Int
hasAccess :: UserId -> Bool
hasAccess id = {-- stuff --}
-- Elsewhere in the program
login :: Int -> Bool
login n = hasAccess n -- Typechecker won't complain
newtype
подобен, но рассматривается по типу проверки в качестве другого типа :
newtype UserId = UserId Int
hasAccess :: UserId -> Bool
hasAccess (UserId id) = {-- stuff --}
-- Elsewhere in the program
login :: Int -> Bool
login n = hasAccess n -- Typechecker will complain, n isn't a UserId !
В C#, вы можете определить тип синонимы с верхним уровнем using
декларации:
using UserId = Int;
Однако строго типизированный псевдоним типа компилятора, по-видимому, не присутствует в C#. Я изучил автоматическое создание кода с помощью шаблонов T4 и CodeDOM для создания оболочки класса, но я действительно не знаю, как я мог бы полностью интегрировать их в поток программирования.
В идеале, я хотел бы быть в состоянии сказать, на высшем уровне:
// Something like this?
using Int.UserId;
/* Elsewhere */
var id = new UserId(5);
public bool HasAccess(UserId id)
{
/* Stuff */
}
Это начинает генерацию кода в передаче во время компиляции. Если это невозможно или предоставляет проблему с курицей и яйцом для IntelliSense, автоматический вариант компиляции, который запускает каждые x минут (или кнопку или что-то еще), будет приятным.
Можете ли вы указать, почему вы хотите это сделать? –
Зачем вам нужно составлять код каждые x минут? – Georg
Каково использование скрытия типа под другим именем? – Franck