【问题标题】:C# explicit casting of derived types派生类型的 C# 显式转换
【发布时间】:2010-01-29 19:24:06
【问题描述】:

如果我创建类 A,而类 B 继承自类 A,为什么 C# 要求我在它们之间显式转换?

例如:

public class Mammal
{
}

public class Dog : Mammal
{
}

...

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

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

【问题讨论】:

  • 不应该要求显式转换,当我测试你的代码时,第一个版本工作得很好。您能否发布更完整的示例?
  • 我想知道当这个问题暗示向上转换不能自动工作时,谁会投票赞成。
  • 投反对票,因为这段代码确实有效
  • 从 Dog 到 Mammal 的隐式转换应该可以正常工作。你确定你的问题不是从哺乳动物转换为狗吗?
  • 这是个提sscce.org的好地方

标签: c# class inheritance casting


【解决方案1】:

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

你的意思是把这个写成你的问题吗...?

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

如果这就是你的意思(这将与 cmets 匹配),那么第一个将不会编译,因为 Mammal 不是 Dog 并且编译器知道它,所以它不会让你分配它( DogMammal,因为它派生自它,但反之则不成立)。在第二个中,您覆盖了编译器的更好判断,并告诉它您更清楚Mammal 确实是Dog,但事实并非如此,此语句将在运行时失败并返回InvalidCastException

【讨论】:

  • 这将是一个差异问题。 blogs.msdn.com/ericlippert/archive/tags/…
  • 我确信我之前已经观察到了这一点,但是是的,看来我的测试代码的类倒退了
  • 正确;这不是方差问题。要想成为一个方差问题,就必须有诸如泛型类型、数组、方法组转换之类的东西。
【解决方案2】:

它们都有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2010-11-01
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多