【发布时间】:2015-10-15 19:23:04
【问题描述】:
为什么不能向上转换到另一个通用接口的不同具体类型。我在 linqpad 中创建了这个示例。现在我可以理解如果你在两个类之间有不同的属性,向上转换会失败,因为它无法完成对象。但是在这种情况下,我看不出为什么向上转型会失败。
void Main()
{
ICommon test = new ConcreteA();
((ConcreteA)test).a.Dump();
// this errors with: Unable to cast object of type 'ConcreteA' to type 'ConcreteB'.
((ConcreteB)test).a.Dump();
}
public interface ICommon
{
string a {get; }
}
public class ConcreteA : ICommon
{
public string a {
get{ return "Concrete A"; }
}
}
public class ConcreteB : ICommon
{
public string a {
get{ return "Concrete B"; }
}
}
编译器是否应该能够将其视为从 double 转换为 int,如果 double 对于 int 而言太大,则会引发异常,但如果可以进行转换,编译器会执行此操作.为什么编译器不尝试将 ConcreteA 作为 ConcreteB 加载,如果 ConcreteB 中有额外的属性无法弄清楚,那么它会抛出。
【问题讨论】:
-
你为什么要在那个场景中投射?只需使用
a.Dump。 -
这不是 C# 功能。如果您希望能够在两个不同的自定义类之间进行转换,则需要定义自己的转换运算符。
-
假设 ConcreteB 有另一个属性“x”(未在
ICommon中定义)并且编译器允许该转换。当你打电话给((ConcreteB)test).x会发生什么 -
“难道我的问题不完美吗?不,不,是喷子!”
-
不是我投反对票。但说真的,两次反对票没什么大不了的。你现在有 2 票赞成!
标签: c# interface casting upcasting