Есть ли способ сильно ввести значения идентификатора целочисленного идентификатора в С#?
Недавно я играл с Haskell и сразу вижу преимущества его сильной печати при применении к значениям ID, например, вы никогда не захотите использовать PersonId вместо ProductId.
Есть ли хороший способ создания Id-класса/структуры, который может использоваться для представления идентификаторов определенного типа?
У меня была следующая идея, но, к сожалению, она не является законной на многих уровнях. Вы не можете иметь абстрактную структуру, и неявные/явные операторы литья не будут унаследованы.
public abstract struct Id
{
int _value;
public Id(int value)
{
_value = value;
}
// define implicit Id to int conversion operator:
public static implicit operator int(Id id)
{
return _value;
}
// define explicit int to Id conversion operator:
public static explicit operator Id(int value)
{
return new Id(value);
}
public bool Equals(object obj)
{
if(GetType() == obj.GetType())
{
Id other = (Id)obj;
return other._value == _value;
}
return false;
}
public int GetHashCode()
{
return _value.GetHashCode();
}
}
struct PersonId : Id { public PersonId(int value) : base(value) {} }
struct ProductId : Id { public ProductId(int value) : base(value) {} }
Существуют ли какие-либо допустимые способы выполнения чего-то подобного? Как еще мы можем доказать, что тип целочисленных идентификаторов не путается в большом приложении?