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