C# 语言规范说明:6.2.4 显式引用转换

2023-12-25

正如我在this https://stackoverflow.com/questions/53559287/c-sharp-foreach-on-ienumerableilistobject-compiles-but-shouldnt/发布后,我遇到了对我来说无法理解的编译器行为。

代码:

IEnumerable<IList<MyClass>> myData = //...getMyData
foreach (MyClass o in myData){}

它可以编译,但在运行时失败:InvalidCastException;对我来说这是显而易见的。

如果我改变IList to List它抱怨如下:

IEnumerable<List<MyClass>> myData = //...getMyData
foreach (MyClass o in myData){}

当我代替班级类型时var如下所示,intellisense 识别出正确的类型:

IEnumerable<List<MyClass>> myData = //...getMyData
foreach (var o in myData){}

我的第一个问题是:为什么编译器不抱怨?答案是该行为尊重C# 语言定义 https://www.microsoft.com/en-us/download/confirmation.aspx?id=7029。请参阅第 116 页第 6.2.4 章显式引用转换。

阅读第四条和第五条声明:

• 从任何接口类型S 到任何类类型T,前提是T 不是密封的或者假设T 实现了S。

• 从任何接口类型S 到任何接口类型T,前提是S 不是从T 派生的。

对于第一个语句的第二部分provided T implements S很清楚,没有疑问。
但是为什么我们可以将接口类型 S 转换为any类类型 T 如果是not派生或not实施的?
在这种情况下,具有非空列表的代码将在不抛出异常的情况下运行InvalidCastException?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 语言规范说明:6.2.4 显式引用转换 的相关文章

随机推荐

  • Google Maps API 在距离起点特定距离的路线上显示图标

    我想在谷歌地图上显示虚拟进度 我想显示带有路线的地图 并且在该路线上我想从一开始就在一定距离处显示一个图标 将根据数据计算 该距离可能随时或每天发生变化 具体取决于与沿虚拟路线的进度相关的数据 例如 在从洛杉矶到纽约的路线上 有一天我可能想
  • 从 WinForms 应用程序检测 IE 版本

    是否可以从 WinForms 应用程序检测计算机上安装的 IE 版本 EDIT 1 我特别感兴趣的是确定是否安装了 IE9 可以安装多个 IE 版本 但 IE9 特别导致我的应用程序出现问题 怎么样 string ver new WebBr
  • 从旧的 LFS 存储库迁移到新的 LFS 存储库?

    Bitbucket 服务器上托管有 LFS git 存储库 现在我们需要创建新的 LFS 存储库并将存储库移至具有 LFS 存储的位置 这个怎么做 例如对于普通的回购我们可以这样做 git remote add new NEW REMOTE
  • python 中被覆盖的变量会发生什么?

    我正在编写一些 python 代码来处理大量数据 近 600 万条 在代码中 我使用一个巨大的 for 循环来处理每组 在该循环中 我在每个循环中使用相同的变量并覆盖它们 当我运行该程序时 我注意到运行时间越长 速度就越慢 此外 经过进一步
  • HTML5 Canvas 100% 高度和宽度

    我试图让这个雨滴画布脚本占据 100 的宽度和高度 但我似乎没有做任何事情 我尝试更改 CSS 以及 Canvas 区域的高度 宽度 但它要么没有改变任何内容 要么使它根本不起作用 有一次我尝试了一些实际上使其成为全尺寸的东西 它似乎对雨滴
  • 非托管内存泄漏

    我正在使用一个使用 BitmapSource 的 WPF 应用程序 但我需要进行一些操作 但我需要对 System Drawing Bitmaps 进行一些操作 应用程序运行时的内存使用量会增加 我已将内存泄漏范围缩小到以下代码 priva
  • 如何在不使用 javascript 的情况下使用 css 混合内容相关和百分比高度/宽度 [重复]

    这个问题在这里已经有答案了 我想实现这样的布局 header height is its content dependant its height is not set it is as heigh as its content stret
  • PHP简单的html DOM从html标签中删除所有属性

    html file get html page php foreach html gt find p as tag name attr substr tag name gt outertext 2 strpos tag name gt ou
  • 使用 Comparator 而不是 equals() 比较两个 Java 集合

    问题陈述 我有两个要比较的相同类型对象的集合 在这种情况下 我想根据不考虑的属性来比较它们equals 对于对象 在我的示例中 我使用排名的名称集合 例如 public class Name private String name priv
  • 如何在定义为“any”的第三方 TypeScript 接口中扩充属性?

    给定一个如下定义的第三方 TypeScript 模块 in node modules third party module index d ts declare module ThirdPartyModule export interfac
  • javax.faces.FacesException:加载 JSF 页面时解码资源数据时出错

    我在加载 JSF 页面时收到下面提到的错误 页面已成功加载 页面上所需的操作也已完成 但出现此错误 jsf 页面包含选项卡面板 单击每个选项卡面板时都会出现错误 我还发现 如果我将页面的某个部分保留为 render false 则不会出现错
  • Android LinearLayout 上的 onTouchListener

    我有一个线性布局 其中很少有子组件 我在线性布局上有 onTouchListener 我也希望在触摸线性布局的子组件时触发 onTouch 事件 您应该能够实施onInterceptTouch事件 http developer androi
  • Gitlab-runner + Docker + Windows - 无效的卷规范

    在提交之前 我尝试使用 Gitlab runner 和 docker 在本地运行我的 Gitlab CI 以确保它们工作正常 但我遇到了一些奇怪的问题 不幸的是我别无选择 只能使用Windows 我过去在Linux上取得了成功 每次我在 p
  • Lift-json 将带有“type”字段的 json 提取到案例类中

    我正在尝试使用 lift json 将 JSON 提取到案例类中 这是我的案例类 case class Person name String age Int 这是 json name Some Name age 24 type Studen
  • 如何使用 Expression Blend 编辑在 Visual Studio 中创建的 DataTemplate?

    For 使用 Expression Blend 的人以及您实际项目中的Visual Studio 请帮助我理解如何在日常开发 设计任务中使用 Blend 和 Visual Studio 这是一个真实的场景 我在 Visual Studio
  • 如何使用 lapply 在 R 中批量处理 geoTIFF

    我有一些大的 geoTIFF 现在我想将它们转换为 ASCII 文件 经过一些搜索后 我编写了这些代码 library raster f lt list files inputFolder pattern tif full names TR
  • 如何区分 clang 和 clang-cl?

    我是 CMake 的新手 在这里遇到了一些障碍 想知道是否有一个 优雅 的解决方案来解决这个问题 或者也许只是一个简单的解决方案 例如 为了设置编译器标志 我正在执行以下操作 target compile options PROJECT N
  • 如何保护控制器不被直接访问?

    我正在将 codeigniter 与 jquery 一起使用 如果您向我解释如何保护控制器不被直接访问 那就太好了 例如 我对标准 jquery 行有看法 handler load tools get stats 工具是我的控制器 具有加载
  • BlackBerry - 如何启动消息应用程序?

    我想在我的应用程序中使用 gtalk 或任何其他信使 但我不知道如何执行此操作 您可以告诉我如何解决这个问题吗 如果您可以向我提供一些网络链接以了解有关此问题的更多信息 对于标准 BB Messenger 请尝试以下操作 int mh Co
  • C# 语言规范说明:6.2.4 显式引用转换

    正如我在this https stackoverflow com questions 53559287 c sharp foreach on ienumerableilistobject compiles but shouldnt 发布后