С#: пользовательское литье в тип значения
Можно ли применить собственный класс к типу значений?
Вот пример:
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;
}
// ...
Ответ 4
Я предлагаю вам реализовать интерфейс IConvertible, который предназначен для обработки этого. См. http://msdn.microsoft.com/en-us/library/system.iconvertible.aspx
Ответ 5
Другая возможность - написать метод расширения Parse и TryParse для вашего класса.
Затем вы должны записать свой код следующим образом:
var x = new Foo();
var y = int.Parse(x);