C# 如何克服 getter 的接口可为空性

问题描述 投票:0回答:1

给出:

//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 值。但在这种情况下,我们是只读的,所以它“可以”工作。

如果有人有解决此问题的好方法,请告诉我。

c# .net visual-studio .net-core
1个回答
0
投票

您可以将

NotNull
属性添加到
ObjectB
的 Id 属性。

class ObjectB : IMaybeHasId
{
    [NotNull]
    public int? Id => 10;
}

这至少让 IDE 现在这个值永远不会是

null
。如果您在代码中检查此属性是否为 null,您将得到一个类型提示,告诉您该检查是多余的,因为它永远不会是
null

© www.soinside.com 2019 - 2024. All rights reserved.