代码之家  ›  专栏  ›  技术社区  ›  Kevin Laity

C#派生类型的显式转换

  •  1
  • Kevin Laity  · 技术社区  · 16 年前

    例如:

    public class Mammal
    {
    }
    
    public class Dog : Mammal
    {
    }
    

    ...

    Mammal foo = new Dog(); // Invalid, wants an explicit cast
    Mammal bar = (Mammal)new Dog(); // This one works
    

    我只是好奇这个限制背后的原因是什么。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Greg Beech    16 年前

    不太清楚你的意思?您编写的这两个语句都可以编译并正常工作。

    你是想把这个写下来作为你的问题吗。。。?

    Dog foo = new Mammal(); // Invalid, wants an explicit cast
    Dog bar = (Dog)new Mammal(); // This one works
    

    如果这就是您的意思(与注释相匹配),那么第一个将不会编译,因为 Mammal 不是一个 Dog 而且编译器知道它,所以它不会让您分配它(a) 哺乳动物 因为它是从它派生出来的,但反过来不成立)。在第二个例子中,您覆盖了编译器更好的判断,并告诉它您更清楚 哺乳动物 真的是一个 狗 ,但事实并非如此,此语句将在运行时失败,并出现错误 InvalidCastException

        2
  •  2
  •   Keith Rousseau    16 年前

    他们都工作。

    推荐文章