gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:35:22 26 4
gpt4 key购买 nike

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

假设我们有:

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: Unable to cast object of type 'Bar' to type 'Foo'

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

提前致谢

编辑:需要说明的是,我知道如何处理这个问题,Foo foo = (Foo)(Bar)bar 可以解决问题。我对错误消息本身更好奇。

最佳答案

那么,消息还能说什么?

如果它说“无法将类型为‘object’的对象转换为类型为‘Foo’”,那会产生误导并且用处不大,因为 obj 不是一个object 的实例,您将无法知道 obj 的实例。

另一种选择类似于“无法将类型为‘Bar’(引用为‘object’)的对象转换为类型为‘Foo’”,但这太冗长了令人困惑。也许它的措辞可以更好,但它仍然很冗长 - 此外,您只需查看源代码即可快速找到相同的信息。

当你考虑它时,消息是有效的(即使它不能说明全部情况)- 可能Bar 转换为 Foo,但在这种特殊情况下,CLR 无法执行此转换。

关于C#:InvalidCastException 误导性消息背后的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5619569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com