C#:InvalidCastException误导消息背后的原因

时间:2011-04-11 09:52:17

标签: c# exception .net

这个特别的问题更多的是试图看到编译器消息背后的原因而不是解决问题,但我希望它没关系。

假设我们有:

class Foo {
    public static explicit operator Foo(Bar bar) {
        return new Foo();
    }
}

Bar的实施并不重要。现在,当您尝试以下操作时,会发生异常:

object obj = new Bar();
Foo foo = (Foo)obj;

它给出InvalidCastException,这是正确的,因为我们没有object类型的强制转换运算符。但是异常消息是:

  

System.InvalidCastException:无法将“Bar”类型的对象强制转换为“Foo”

这有点误导,因为我显然可以Bar类型的对象转换为Foo类型。我希望编译器告诉我,我基本上是在尝试转换System.Object类型的对象,而不是Bar。 我的理解是否有缺陷?如果是这样,这种行为背后的原因是什么?

提前致谢

编辑:为了清楚起见,我知道如何处理这个问题,Foo foo = (Foo)(Bar)bar将会解决问题。我对错误信息本身更感兴趣。

2 个答案:

答案 0 :(得分:2)

那么,该消息还能说什么?

如果它说“无法将类型'对象'的对象强制转换为'Foo'”,那将会产生误导并且不太有用,因为obj不是{的实例{1}},您无法知道object 的实例。

另一种选择是“无法将类型为'Bar'的对象(引用为'对象')输入'Foo'”,但这很冗长,有点像混乱。也许它的措辞可能更好但仍然冗长 - 此外,只需查看源代码,您就可以快速找到相同的信息。

当你考虑它时,消息是有效的(即使它没有说明整个故事) - 从objBar可能,但在这种特殊情况下,CLR无法执行此演员表。

答案 1 :(得分:0)

它在你的代码中:

public static explicit operator Foo(Bar bar) {

它可能会成功:

public static implicit operator Foo(Bar bar) {

或者,你可以写:

Foo foo = (Foo)(Bar)bar;