【发布时间】:2018-06-07 16:27:36
【问题描述】:
假设有一个像这样的基类,称为Cup:
public abstract class Cup { }
我们假设有PaperCup 继承Cup 和PlasticCup 继承PaperCup 类。
public class PlasticCup : PaperCup { }
public class PaperCup : Cup { }
并假设 Main 类中有两个方法。
static void Test01 (PaperCup cup) { }
static void Test02 (Cup cup) { }
测试1
PaperCup A = new PaperCup();
Test01(A);
Test02(A);
上面的代码工作正常。 A 实例可以传递给这两个函数,因为它本身就是 PaperCup 并且它继承了 Cup 基类。
测试2
PlasticCup B = new PlasticCup();
Test01(B);
Test02(B);
上面的代码仍然可以正常工作。 B 实例虽然是PlasticCup,但也可以被函数获取,但它继承PaperCup,最终派生自Cup。
但是泛型!!
让我们看看下面的方法。
static void Test010 (IList<PaperCup> cup) { }
static void Test011(IList<PlasticCup> cup) { }
static void Test012(IList<Cup> cup) { }
下面的这个试验将在两次方法调用中失败。
IList<PlasticCup> BB = new List<PlasticCup>();
Test010(BB); // Fail CS1503 Compiler Error
Test011(BB);
Test012(BB); // Fail CS1503 Compiler Error
简单问题
为什么当它们采用Generic 时,无法将派生类型传递给这些函数?因为 C# 是一种 OOP 语言,它不应该工作吗?
【问题讨论】:
-
“因为 C# 是一种 OOP 语言?”我想知道你是怎么得出这个结论的。 C# 是一种多范式语言,甚至是一种函数式语言。
-
@CamiloTerevinto imo 这不是一个很好的更新,如果您要编辑,更改代码几乎不是一个好主意。
-
@DavidG 怎么样?我只删除了完全不相关的代码,使问题更短。
-
@CamiloTerevinto 只需对问题进行很小的更改,该代码就会变得相关。该代码没有造成任何伤害,删除它是一种浪费。
标签: c# oop generics polymorphism