为什么声明时需要隐式向上转型?

3

我为什么想要在声明时进行隐式向上转型?我的问题源于我的教科书中的以下代码。

private readonly IList<Inventory> _cars = new ObservableCollection<Inventory>();

为什么我不只是这样做呢?

private readonly ObservableCollection<Inventory> _cars = new ObservableCollection<Inventory>();

如果我只是为了节省空间,那为什么不这样做呢?

private readonly var _cars = new ObservableCollection<Inventory>();

感谢您,
2个回答

4
这不是为了省去按键,而是关于“最小特权”的原则。
这是关于以下内容:
private readonly var _cars = new ObservableCollection<Inventory>();

并且这个:

private readonly ObservableCollection<Inventory> _cars = new ObservableCollection<Inventory>();

明确声明_cars是可观察的。您之后编写的代码可能会依赖于此,即使这不是您最初的设计意图。通常情况下,您希望使用最简单的接口来完成工作,因此如果您的某些代码部分不需要知道某些内容是可观察的,则静态类型化变量以使用非可观察接口是一个好的实践。

当您编写以下内容时:

private readonly IList<Inventory> _cars = new ObservableCollection<Inventory>();

你明确表明你不想编写依赖于_cars可观察性的代码,如果这样做,编译器会出错并发出警告,这是好的。

私有只读变量 _cars =.. 没有其他声明,除了“我是编译器错误”。 - pinkfloydx33

1
除了上述特权原则外,这里还有两个理由:
1. 通过基类使用面向对象编程。例如将三角形和圆形存储到形状列表中(经典的大学示例),以及工厂(可以通过引用返回任意数量的具体实现)。
2. 获取访问 .Net 装箱伪接口的权限。例如,IConvertible convertible = 5;int 没有接口,事实上没有值类型具有接口,但是当装箱(转换为 object)时,框架允许您访问它们,就像它们实现了一堆接口一样。

尽管 C# 10 的“任意类型”实现为 #1 提供了一个可靠的替代方案。 - Blindy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接