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

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

假设我们有:

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

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

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

它给出了InvalidCastException,这是正确的,因为我们没有对象类型的转换运算符.但是异常消息是:

System.InvalidCastException: Unable to cast object of type ‘Bar’ to type ‘Foo’

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

提前致谢

编辑:为了清楚,我知道如何处理这个问题,而且Foo foo =(Foo)(Bar)栏就可以了.我对错误信息本身更感兴趣.

解决方法

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

如果它说“无法将类型’对象’的对象强制转换为’Foo”,那么这会产生误导并且不太有用,因为obj不是对象的实例,你也无法知道什么是obj一个例子.

另一种选择是“无法将类型为’Bar’的对象(引用为’对象’)输入’Foo’”,但这很冗长,有点令人困惑.也许它的措辞可能更好,但它仍然冗长 – 此外,您只需查看源代码即可快速找到相同的信息.

当你考虑它时,消息是有效的(即使它没有告诉整个故事) – 可以从Bar转换为Foo,但在这种特殊情况下,CLR无法执行此转换.

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...