Есть ли способ неявно построить тип в С#?

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

Например, определяя следующие:

public struct Meter
{
    public int Value;

    public Meter(int value)
    {
        this.Value = value;
    }
}

public struct Second
{
    public int Value;

    public Second(int value)
    {
        this.Value = value;
    }
}

позволяет мне не смешивать счетчики и секунды, потому что это отдельные типы данных. Это здорово, и я вижу, насколько он полезен. Я знаю, что вам все равно нужно определить перегрузки операторов для обработки любой арифметики с этими типами, но я оставляю это для простоты.

Проблема с этим подходом заключается в том, что для использования этих типов мне нужно каждый раз использовать полный конструктор, например:

Meter distance = new Meter(5);

Есть ли какой-либо способ в С#, я могу использовать тот же режим построения, который использует System.Int32, например:

Meter distance = 5;

Я попытался создать неявное преобразование, но похоже, что это должно быть частью типа Int32, а не мои пользовательские типы. Я не могу добавить метод расширения к Int32, потому что он должен быть статичным, поэтому есть ли способ сделать это?

Ответ 1

Вы можете указать неявное преобразование непосредственно в самих структурах.

public struct Meter
{
    public int Value;

    public Meter(int value)
    {
        this.Value = value;
    }

    public static implicit operator Meter(int a)
    {
         return new Meter(a);
    }
}

public struct Second
{
    public int Value;

    public Second(int value)
    {
        this.Value = value;
    }

    public static implicit operator Second(int a)
    {
         return new Second(a);
    }
}