是否可以将自定义类转换为值类型?
以下是一个例子:
var x = new Foo();
var y = (int) x; //Does not compile
是否有可能实现上述目标?我是否需要在Foo
中重载某些内容?
答案 0 :(得分:23)
您必须重载强制转换操作符。
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;
}
}
答案 1 :(得分:7)
创建显式或隐式转换:
public class Foo
{
public static explicit operator int(Foo instance)
{
return 0;
}
public static implicit operator double(Foo instance)
{
return 0;
}
}
不同之处在于,通过显式转换,您必须自己进行类型转换:
int i = (int) new Foo();
并且通过隐式转换,您可以“分配”事物:
double d = new Foo();
MSDN有这样的说法:
“通过消除不必要的强制转换,隐式转换可以提高源代码的可读性。但是,由于隐式转换不需要程序员从一种类型明确地转换为另一种类型,因此必须注意防止意外结果。一般情况下,隐式转换运算符永远不应该抛出异常,永远不会丢失信息,以便在没有程序员意识的情况下安全地使用它们。如果转换运算符不能满足这些标准,则应将其标记为显式。“(强调我的)
答案 2 :(得分:5)
public class Foo
{
public static implicit operator int(Foo d)
{
return d.SomeIntProperty;
}
// ...
答案 3 :(得分:1)
我建议您实现IConvertible接口,因为它旨在处理此问题。见http://msdn.microsoft.com/en-us/library/system.iconvertible.aspx
答案 4 :(得分:0)
另一种可能性是为您的班级编写Parse和TryParse扩展方法。
然后按如下方式编写代码:
var x = new Foo();
var y = int.Parse(x);