С#: пользовательское литье в тип значения

Можно ли применить собственный класс к типу значений?

Вот пример:

var x = new Foo();
var y = (int) x; //Does not compile 

Можно ли сделать вышеизложенное? Мне нужно перегрузить что-то в Foo?

Ответ 1

Вам придется перегрузить оператор трансляции.

    public class Foo
    {
        public Foo( double d )
        {
            this.X = d;
        }

        public double X
        {
            get;
            private set;
        }


        public static implicit operator Foo( double d )
        {
            return new Foo (d);
        }

        public static explicit operator double( Foo f )
        {
            return f.X;
        }

    }

Ответ 2

Создайте явное или неявное преобразование:

public class Foo
{
    public static explicit operator int(Foo instance)
    {
        return 0;
    }

    public static implicit operator double(Foo instance)
    {
        return 0;
    }
}

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

int i = (int) new Foo();

и с неявными преобразованиями, вы можете просто "назначить" вещи:

double d = new Foo();

MSDN говорит следующее:

"Исключая ненужные приведения, неявные преобразования могут улучшить удобочитаемость исходного кода. Однако, поскольку неявные преобразования не требуют, чтобы программисты были явно переданы от одного типа к другому, необходимо соблюдать осторожность, чтобы предотвратить неожиданные результаты. В целом, неявные операторы преобразования никогда не должны бросать исключения и никогда не терять информацию, чтобы их можно было безопасно использовать без осведомленности программиста. Если оператор преобразования не может выполнить эти критерии, он должен быть помечен как явный." (Emphasis mine)

Ответ 3

Вам нужно определить explicit или неявно литье:

public class Foo
{
    public static implicit operator int(Foo d)
    {
        return d.SomeIntProperty;
    }

    // ...

Ответ 5

Другая возможность - написать метод расширения Parse и TryParse для вашего класса.

Затем вы должны записать свой код следующим образом:

var x = new Foo();
var y = int.Parse(x);