gpt4 book ai didi

c# - 将 IList 转换为 IList 在运行时失败
转载 作者:太空狗 更新时间:2023-10-29 20:51:34 24 4
gpt4 key购买 nike

我有以下简短的 C# 程序:

IList<string> listString = new List<String>();
IList<object> listObject;

listObject = listString;

此程序无法编译。最后一行导致以下编译错误:

Cannot implicitly convert type 'System.Collections.Generic.IList' to 'System.Collections.Generic.IList'. An explicit conversion exists (are you missing a cast?)

所以,我添加了类型转换:

listObject = (IList<object>)listString;

现在程序可以正确编译,但在运行时失败。引发 InvalidCastException 并显示以下消息:

Unable to cast object of type 'System.Collections.Generic.List'1[System.String]' to type 'System.Collections.Generic.IList'1[System.Object]'.

要么转换是非法的并且应该被编译器捕获,要么是合法的并且不应该在运行时抛出异常。为什么会出现不一致的行为?

澄清:我不是在问 Actor 为什么失败。我明白为什么这样的类型转换是有问题的。我在问为什么转换失败只在运行时

最佳答案

隐式转换来自 IList<string> 的原因至 IList<object>不会编译是,你似乎知道,IList<T>接口(interface)在 T 是协变的.如果在 .NET 4.5 中,您使用了 IReadOnlyList<out T>相反,它会起作用。

显式转换的原因

listObject = (IList<object>)listString;

编译,不就是IList<string>吗和 IList<object>以任何方式相关。两种类型都不能分配给另一种。原因是你的变量( listString )的运行时类型可能是一个实现了两个接口(interface)的类(或结构)!假设我做了这门课:

class CrazyList : IList<string>, IList<object>  // not very smart
{
// a lot of explicit interface implementations here
}

然后如果一些IList<string>碰巧是CrazyList在运行时,显式转换成功。当您编写显式强制转换时,您是在告诉编译器“我知道该类型将可转换为我正在强制转换的类型”。既然编译器不能证明你错了,它当然相信你。

关于c# - 将 IList<string> 转换为 IList<object> 在运行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17521818/

24 4 0