您的代码无法编译,用户@SamiKuhome 提供的dotnetfiddle 所描述的错误实际上非常详细地说明了原因。
无法通过引用转换、装箱转换、拆箱转换、包装转换或空引用转换将类型“a”转换为“b”
编译器不知道如何在类型a 和b 之间进行转换,因为类之间没有关系。
回答您的问题:“如果可能,请说明使用它的目的和优势是什么?”
在a 和b 两个类之间建立关系。
假设b 类是a 类的规范:
public class a
{
public void test()
{
console.writeline("test");
}
}
public class b extends a // note change, here
{
public void test()
{
console.writeline("test");
}
}
分类
考虑类组是最容易的;
你可能有一个c 的类,它也是extends a。 b 和 c 都将被认为在 common 中有 a。在现实世界中,我们看到这是由科学领域建模的(这就是“类”一词的来源:分类):某物可能是“动物”(a),但这不是很具描述性。为了进一步说明我们正在处理的动物类型(在这种情况下,b 和 c - 可能是海豚和猫)。
所有这些动物可能有共同点:这将被视为a 的特征。
分类使用规则
对于分类如何相互协作来描述关系,编程语言非常固执己见。您的代码可能无法以其他语言编译(如果保持上述关系)并且 - 至少 - 会生成警告。
为什么?
当代码使用a 的对象或实例时,它只想与该特定类型进行交互或仅与该特定类型进行约定。编译器只知道a 类型是a。
转换为更具体的类型通常被认为是危险的(这并不意味着它没有完成)。
b 和 c 都满足 a 要求 - 它们都共享分类;然而,在运行时,我们不能确定我们遇到的每个a 实例确实是一个特定的规范。我们可能会同时看到b 和c。而且 - 正如我们可以想象的那样 - 强迫海豚成为猫并不是特别有意义(或真的可能)。
如果您想详细了解这些概念背后的动机,请查看Liskov's Substitution Principle。