繁体   English   中英

C#:自定义转换为值类型

[英]C#: Custom casting to a value type

是否可以将自定义类转换为值类型?

这是一个例子:

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;
    }
}

不同的是,通过显式转换,您必须自己进行类型转换:

int i = (int) new Foo();

通过隐式转换,您可以“分配”事物:

double d = new Foo();

MSDN有这样的说法:

“通过消除不必要的强制转换,隐式转换可以提高源代码的可读性。但是,由于隐式转换不需要程序员从一种类型显式转换为另一种类型,因此必须注意防止意外结果。 通常,隐式转换运算符应该永远不会抛出异常并永不丢失信息,以便在没有程序员意识的情况下安全地使用它们。如果转换操作符不能满足这些标准,则应将其标记为明确。 “(强调我的)

您需要定义显式隐式转换:

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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM