可能的重复:
编译时和运行时转换 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
}
}
我的问题是...
- 如果我的假设不成立,那么有人可以提供一个例子来证明他们是如何偏离的吗?
- 如果我的假设是正确的,那么为什么编译器不警告此错误?
允许这种转换有几个原因。
首先,正如人们在其他答案中所说,强制转换运算符的意思是“我比你知道的更多;我向你保证这个转换会成功,如果我错了,抛出一个异常并使进程崩溃”。如果你对编译器撒谎,就会发生不好的事情;你实际上是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(使用前将#替换为@)