为什么 C# 编译器不捕获 InvalidCastException [重复]

2024-03-13

可能的重复:
编译时和运行时转换 C# https://stackoverflow.com/questions/4499528/compile-time-and-runtime-casting-c-sharp

据我了解,以下代码将always编译,并将另外always在运行时失败,抛出一个InvalidCastException.

Example:


public class Post { }
public class Question : Post { }
public class Answer : Post 
{
    public void Fail()
    {
        Post p = new Post();
        Question q = (Question)p; // This will throw an InvalidCastException
    }
}

我的问题是...

  1. 如果我的假设不成立,那么有人可以提供一个例子来证明他们是如何偏离的吗?
  2. 如果我的假设是正确的,那么为什么编译器不警告此错误?

允许这种转换有几个原因。

首先,正如人们在其他答案中所说,强制转换运算符的意思是“我比你知道的更多;我向你保证这个转换会成功,如果我错了,抛出一个异常并使进程崩溃”。如果你对编译器撒谎,就会发生不好的事情;你实际上是not做出保证,以及该计划is结果崩溃了。

现在,如果编译器可以判断出你在对它撒谎,那么它就能抓住你的谎言。编译器不需要非常聪明地抓住你的谎言!确定 Base 类型的表达式需要进行流分析never成为 Derived 类型很复杂;比我们已经实现的用于捕获未分配的局部变量之类的逻辑要复杂得多。与提高编译器发现明显谎言的能力相比,我们有更好的方法来花费时间和精力。

因此,编译器通常只推理types表达方式,而不是关于可能的值。仅从类型分析中不可能知道转换是否会成功。它might成功了,所以它是被允许的。唯一不允许的强制转换是编译器知道会进行的强制转换always fail 从类型分析。

其次,它是possible to say (Derived)(new Base())其中 Derived 是实现 Base 类型并拥有它的类型not在运行时失败。也可以用于(Base)(new Base())在运行时因无效转换异常而失败!真实的事实!这些都是极其罕见的情况,但它们are可能的。

有关更多详细信息,请参阅我关于该主题的文章:

  • C# 中的链接式用户定义显式转换 https://learn.microsoft.com/en-us/archive/blogs/ericlippert/chained-user-defined-explicit-conversions-in-c
  • C# 中的链接式用户定义显式转换,第二部分 https://learn.microsoft.com/en-us/archive/blogs/ericlippert/chained-user-defined-explicit-conversions-in-c-part-two
  • C# 中的链接式用户定义显式转换,第三部分 https://learn.microsoft.com/en-us/archive/blogs/ericlippert/chained-user-defined-explicit-conversions-in-c-part-three
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C# 编译器不捕获 InvalidCastException [重复] 的相关文章

随机推荐

  • 未注入通过 RequireJS 从 CDN 加载 Angular

    在我的项目中 我想使用 RequireJS 并引导我的应用程序 如下所示 requirejs config baseUrl scripts vendor paths jquery https ajax googleapis com ajax
  • CustomAttribute反映html属性MVC5

    希望找到一种方法 当在 MVC5 中使用 Custom 属性或最好使用 RegularExpressionAttribute 装饰模型中的属性时 html 控件将包含它作为控件的另一个属性 例如 class CoolModel Custom
  • Hibernate 查询语言中四舍五入到小数点后两位

    你好 有人可以帮我如何在 hql 中四舍五入到小数点后两位吗 我在网上找不到任何东西 以下是我的查询 Select p amount as amt p desc from pay p register r where r type 1 an
  • 将字符串中匹配的正则表达式值替换为字典中的正确值

    我有一根绳子 var text the animal jumped over the description fox 和一本字典 var dictionary animal dog description jumped 我正在编写一个函数
  • CSS:100% 字体大小 - 100% 是什么?

    有many http www alistapart com articles howtosizetextincss articles http www w3 org TR CSS2 fonts html font size props an
  • java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener 错误

    您好 我的 struts1 spring 和 hibernate 集成中的动态 Web 应用程序是在 64 位计算机上开发的 它在 64 位计算机上运行良好 但在 32 位计算机上出现 jar 问题 并给出以下错误 SEVERE Error
  • 从 Google Chrome 自动生成 HAR 文件

    基本上我需要的是一种自动化的方法result以下操作 打开一个新选项卡 打开开发者工具中的网络选项卡 加载一个 URL 选择 全部另存为 HAR 通常 建议的解决方案涉及使用PhantomJS http phantomjs org brow
  • WAMP 的 MySQL 数据库文件驻留在哪里?

    我只是好奇 因为我开始学习 PHP 和 MySQL MySQL 的数据库和其他文件驻留在硬盘上的位置 我在 Windows XP SP2 平台上安装了 WAMP 从以下命令的输出中探索变量 mysql gt show variables l
  • Xamarin.Forms 中主从页面的母版页有多宽?

    根据屏幕尺寸 和设备习惯 母版页的宽度会有所不同 在手机上 它约为屏幕宽度的 80 而在平板电脑上 它似乎是一个恒定尺寸 如 320 dp 有人知道这个值的一般公式吗 我想用它在施工期间布置一些元素 当Width属性尚未设置 Edit I
  • 在 django 中使用 Context 时如何禁用 HTML 编码

    在我的 django 应用程序中 我使用模板来构建电子邮件正文 其中一个参数是 url 请注意 url 中有两个参数以 分隔 t loader get template sometemplate c Context foo bar url
  • ES6 Promise / Typescript 和 Bluebird Promise

    我有一个 nodejs typescript 2 项目并使用es6 promise https github com stefanpenner es6 promise包裹 现在我想摆脱额外的包 因为我可以直接在打字稿中定位 ES6 所以我删
  • Git和ssh授权

    我无法使用生成的 ssh 密钥登录 github 我已经按照本手册进行操作 http help github com linux key setup http help github com linux key setup但在步骤 ssh
  • 是否可以在任何现有的 onsubmit/submit 之前绑定一个 Submit() 函数?

    我有一个表格onsubmit属性 我需要绑定一个新的提交事件 并且需要在任何现有的提交函数之前执行该事件 下面的代码演示了这个问题
  • 嵌套砌体对象

    我正在尝试使用容器创建图形视图 因此 如果 A s gt B s gt C s 视图将显示 Bs 内的对象 c 而 Bs 又在 As 内 Something like this 我认为砌体视图非常适合此目的 但我无法使嵌套正常工作 到目前为
  • .NET Ionic.Zip:压缩或未压缩大小,或偏移量超过最大值

    我进行了以下设置 Win2008服务器 Ionic zip 参考模块 用于构建 zip 文件的单独驱动器 NET 4 0 Web 应用程序即时构建 zip 包 并允许客户端下载该包 该系统一直运行良好 直到现在 最近我们添加了一些较大的文件
  • git error“请告诉我你是谁。”和赫罗库

    我当时工作于branch master 并提交到 Git 存储库 一切都很好 我将新应用程序连接到 Heroku 上的这个存储库 我同时致力于 Heroku 和 Git 一切又恢复正常了 除了我无法在 Heroku 上运行 db migra
  • GAE - Python 3.7 - 如何登录?

    我有一个 python 3 7 中的谷歌应用程序引擎项目 我想在其中编写一些日志 我习惯在应用程序引擎 python 2 7 中编程 并且使用简单的代码 logging info hi there 将任何日志写入谷歌云日志控制台 上面的命令
  • 单击带有 codemirror 的按钮时如何撤消选定/突出显示的文本

    我有一个简单的 codemirror 文本编辑器 正在使用 bootstrap 进行工作 我可以单击粗体和代码按钮 确定 它会正确包装所选 突出显示的文本 问题一 当文本包含在标签中时 可以说 b something b 如果我再次选择 突
  • 将图像置于 css 圆的中心

    这是 CSS 圆圈中的图像 我希望圆圈围绕图像 因此图像应该位于中心 我怎样才能做到这一点 HTML div class circletag img src images no png div CSS div circletag displ
  • 为什么 C# 编译器不捕获 InvalidCastException [重复]

    这个问题在这里已经有答案了 可能的重复 编译时和运行时转换 C https stackoverflow com questions 4499528 compile time and runtime casting c sharp 据我了解