C# 将基类强制转换为派生类时未在编译时引发错误

C# 将基类强制转换为派生类时未在编译时引发错误,c#,oop,casting,C#,Oop,Casting,您有如下所示的这些类: public class A { } public class B : A { } 将基类强制转换为派生类的类型 A w = (B) new A(); B x = (B) new A(); 这在运行时不起作用,因为您无法真正将基类转换为派生类 但是为什么没有编译时错误呢?为什么visual studio允许我在抛出错误之前到达运行时?在c中,对于用户定义的类,强制转换是在运行时进行的,这就是为什么编译器不会抛出错误。您可以查看更多信息。从一个基本类型(字符串

您有如下所示的这些类:

public class A
{
}

public class B : A
{
}
将基类强制转换为派生类的类型

A w = (B) new A();    
B x = (B) new A();
这在运行时不起作用,因为您无法真正将基类转换为派生类


但是为什么没有编译时错误呢?为什么visual studio允许我在抛出错误之前到达运行时?

在c中,对于用户定义的类,强制转换是在运行时进行的,这就是为什么编译器不会抛出错误。您可以查看更多信息。从一个基本类型(字符串)到另一个基本类型(int)的转换称为编译时,因为编译器知道字符串不能被类型转换为int!但在用户定义的类中,有一个机会!:)

在c#中,对于用户定义的类,强制转换是在运行时进行的,这就是为什么编译器不会抛出错误。您可以查看更多信息。从一个基本类型(字符串)到另一个基本类型(int)的转换称为编译时,因为编译器知道字符串不能被类型转换为int!但在用户定义的类中,有一个机会!:)

有两种类型的类型转换

  • 一旦这显然是不允许的,当类没有共同的基础,因此演员没有机会成功。即“字符串”到“整型”。这样的强制转换被编译器捕获并导致错误
  • 有机会成功的铸型-基础衍生有合理的成功机会。编译器允许这样的强制转换

我相信,即使cast肯定会失败,
(B)new A()
也可以在编译时使用,这是因为
(B)某些类型的objectoftypea
可以成功,而
new A()
肯定是此类“类型的对象”之一。编译时检测可能需要额外的基础结构,但没有发现有什么好处(因为此强制转换在运行时会立即失败,因此即使是最基本的代码测试也不会错过它)。

有两种强制转换类型

  • 一旦这显然是不允许的,当类没有共同的基础,因此演员没有机会成功。即“字符串”到“整型”。这样的强制转换被编译器捕获并导致错误
  • 有机会成功的铸型-基础衍生有合理的成功机会。编译器允许这样的强制转换

我相信,即使cast肯定会失败,
(B)new A()
也可以在编译时使用,这是因为
(B)某些类型的objectoftypea
可以成功,而
new A()
肯定是此类“类型的对象”之一。编译时检测可能需要额外的基础设施,但没有发现有什么好处(因为此强制转换在运行时会立即失败,因此即使是最基本的代码测试也很难错过)。

但为什么在编译时已使用此代码抛出错误:int d=23;var f=(bool)d;呵呵。。没有抓住这一点。int和bool是已知的类型,在运行时它们不可能被正确地强制转换,因此您会看到错误。相应地编辑了答案:)对不起,我的错误。但是为什么在编译时已经抛出了一个错误;var f=(bool)d;呵呵。。没有抓住这一点。int和bool是已知的类型,在运行时它们不可能被正确地强制转换,因此您会看到错误。相应地编辑了答案:)对不起,我的错误。这可能会有帮助:C#编译器允许从派生类到基类进行显式转换,但您必须确保没有运行时错误这实际上是错误的,无论您编写显式转换还是隐式转换,在运行时,您“”收到一个异常,因为不允许转换为派生类。这可能会有所帮助:C#编译器允许从派生类到基类进行显式转换,但您必须确保没有运行时错误这实际上是错误的,无论您编写显式转换还是隐式转换,在运行时,您“”收到异常,因为不允许转换为派生类。ahhh。。因此,您的意思是,microsoft可能有一种方法可以在编译时立即引发错误,但发现这是一个小问题,因为他们确信它将在运行时失败,“base to derived有合理的成功机会”-您能举个例子吗?“可能有一种方法可以在编译时立即引发错误”-这是我的猜测。我对规范不太熟悉,不知道它到底是需求还是碰巧是需求。@RojBeraña
(B)(a)(new B())
-成功转换编译类型为a的变量的几率为100%-
(a)new B()
-派生类B。也有很多类型转换应该会成功,但当您处理泛型时,编译器无法找到它,您会看到奇怪的代码,如
(t)(object)argument
(Eric Lippert在前面的评论中链接了一些有趣的案例)它可能成功的真实场景:动物a=新狗();狗d=(狗)a;啊。。因此,您的意思是,microsoft可能有一种方法可以在编译时立即引发错误,但发现这是一个小问题,因为他们确信它将在运行时失败,“base to derived有合理的成功机会”-您能举个例子吗?“可能有一种方法可以在编译时立即引发错误”-这是我的猜测。我对规范不太熟悉,不知道它到底是需求还是碰巧是需求。@RojBeraña
(B)(a)(new B())
-成功转换编译类型为a的变量的几率为100%-
(a)new B()
-派生类B。也有很多类型转换应该会成功,但当您处理泛型时,编译器无法找到它,您会看到奇怪的代码,如
(t)(object)argument
(Eric Lippert在前面的评论中链接了一些有趣的案例)它可能成功的真实场景:动物a=新狗();狗d=(狗)a;