给出:
//Common interface for objects that may have an Id value
Interface IMaybeHasId
{
public Int? Id {get;} //Note this is a GET only
}
//Object A never has an Id, this code works fine
Class ObjectA : IMaybeHasId
{
Int? Id => null;
}
//Object B always has an Id
//This code will not work as Id here is Int not Int?
Class ObjectB : IMaybeHasId
{
public Int Id => 10;
}
我需要这个,因为当我的代码使用对对象 B 的纯引用时,代码可以期望 Id 始终可用。
使用对对象 A 的纯引用时,Id 可能不可用。
但是我想将它们放入一个公共集合中,即List()
在处理列表中的项目时,可以担心 Id 可能为空(根据界面)。即我们将通过 Id 为 Int 的接口契约获得一个对象引用?完全没问题。
编译器将停止上面代码的编译
这是一个真正的痛苦,因为从人类的角度来看,这里没有真正的问题。 对象B(总是有一个Id)的契约将遵守该对象类型可能有一个Id的接口。请注意,此合约是 GET,因此非空值符合可为空的限制。它只是碰巧永远不会为空。
显然,如果属性是可写的/可设置的,那么这将不起作用。因为对象 B 无法接受 null 值。但在这种情况下,我们是只读的,所以它“可以”工作。
如果有人有解决此问题的好方法,请告诉我。
您可以将
NotNull
属性添加到 ObjectB
的 Id 属性。
class ObjectB : IMaybeHasId
{
[NotNull]
public int? Id => 10;
}
这至少让 IDE 现在这个值永远不会是
null
。如果您在代码中检查此属性是否为 null,您将得到一个类型提示,告诉您该检查是多余的,因为它永远不会是 null
。