Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:自定义转换为值类型_C#_.net_Casting - Fatal编程技术网

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

C#:自定义转换为值类型,c#,.net,casting,C#,.net,Casting,是否可以将自定义类强制转换为值类型 下面是一个例子: var x = new Foo(); var y = (int) x; //Does not compile 是否有可能实现上述目标?是否需要在Foo中重载某些内容?您必须重载cast操作符 public class Foo { public Foo( double d ) { this.X = d; } public double

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

下面是一个例子:

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

是否有可能实现上述目标?是否需要在
Foo
中重载某些内容?

您必须重载cast操作符

    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();
通过隐式转换,您可以“分配”内容:

有这样的说法:


通过消除不必要的强制转换,隐式转换可以提高源代码的可读性。但是,由于隐式转换不需要程序员显式地从一种类型转换到另一种类型,因此必须注意防止出现意外结果一般来说,隐式转换运算符不应抛出异常,也不应丢失信息,以便在程序员不知情的情况下安全地使用它们。如果转换运算符不能满足这些条件,则应将其标记为显式。“(Emphasis mine)

另一种可能性是为类编写Parse和TryParse扩展方法

然后按如下方式编写代码:

var x = new Foo();
var y = int.Parse(x); 
您需要定义或转换:


我建议您实现IConvertible接口,因为它是为处理此问题而设计的。请参见

为什么您要将其作为扩展方法而不是常规成员方法编写?它是他的类,所以他可以控制它。因为当您有锤子时,每个问题都是钉子。@Mark:即使您编写了扩展方法,您也不能然后将其与“var y=int.Parse(x)”一起使用;因为扩展方法只适用于实例;“相反,在这种情况下,为什么不像弗雷德里克说的那样将ParseToInt方法放在类本身中。在不了解更多关于他的Foo类的情况下,我只是提供了另一种可能性。@马丁·布朗:你是说其他Try和TryParse方法都是锤子吗?不,它们符合处理字符串的范例。我真的不能推断出多少。”问题域的h。@Frederik:他对扩展方法的控制力和他自己的类一样大。没有标记,Martin是在暗示扩展方法是锤子。:)扩展方法的问题是,你把逻辑分散在所有地方,扩展方法不会被intellise直接显示nse,如果定义扩展方法的名称空间未被“使用”。由于您可以控制foo类,因此最好将TryParse方法作为常规成员方法编写,而不是作为扩展方法编写。您可以在回答中解释隐式和显式的用法吗?谢谢。非常好,这正是我在ans中寻找的干杯,你希望它做什么?I.o.w,福长什么样?
var x = new Foo();
var y = int.Parse(x); 
public class Foo
{
    public static implicit operator int(Foo d)
    {
        return d.SomeIntProperty;
    }

    // ...