2013-09-27 27 views
0

我尝试转换为具有浮动隐式转换器的类的浮动匿名对象。我不确定我是否正确解释。下面是例子:匿名对象的隐式类型转换

我有以下类:

public class MyFloat 
{   
    public float Value { get; set; } 

    public MyFloat(float val) 
    { 
     Value = val; 
    } 

    public static implicit operator MyFloat(float v) 
    { 
     return new MyFloat(v); 
    } 

    public static implicit operator float(MyFloat d) 
    { 
     return d.Value; 
    } 

然后,如果我尝试:

object f1 = new MyFloat(5.0f); 
float f2 = f1; // Unhandled Exception: System.InvalidCastException: Specified cast is not valid. 
float f3 = (MyFloat)f1; 

我得到InvalidCastException的。我假设f1被视为对象,并没有检查它是否是真实类型(MyFloat)对于浮动转换器是隐式的。 有什么办法可以解决这个问题吗?

在此先感谢

+2

第二行是否编译?它看起来不应该是...... –

+0

还请注意,“匿名对象”不是一个有意义的术语。我不知道你的意思...... –

+0

@MrFox但是,然后,浮点运算符的定义是没有意义的。 –

回答

0

这里的问题是,像你说的,f1作为object对待,不能MyFloat - 你需要从object转换回MyFloat然后隐式强制转换将会工作(就像你的第二个例子)。

或者,请不要将其声明为object以开始并使用它的实际类型 - MyFloat

+0

'var f1'会诀窍吗? –

+0

@jyparask是的,它会的。 var推断变量类型。 –

+0

@jyparask是的,但是,'var'只是说“*在这里使用真实类型*”的简短方式。 – James

1

不要使用objectMyFloat,否则编译器不知道在编译时,你的objectMyFloat类型:

相反的:

object f1 = new MyFloat(5.0f); 
float f2 = f1; // Unhandled Exception: System.InvalidCastException: Specified cast is not 

这个:

MyFloat f1 = new MyFloat(5.0f); 
float f2 = f1; 

或相应方法进行投放(尽管这似乎是多余的):

float f2 = (MyFloat)f1