【发布时间】:2019-11-25 04:01:11
【问题描述】:
我有一个带有受保护成员的 C# 类,我需要它可以为空。
该类的目的是返回某个状态的评估,该评估可以与其他状态的评估进行比较以进行排序。我希望默认评估为空,以便我可以知道是否需要在评估时执行评估(但在初始化类时不需要执行它,因为它可能不需要调用并且计算成本可能很高)
public abstract class EvaluableState<TEvaluation> where TEvaulation : IComparable<TEvaluation>
{
protected TEvaluation? evaluation;
protected EvaluableState()
{
evaluation = null; // cannot convert null to type parameter because it could be a non-nullable value type
}
public TEvaluation GetEvaluation()
{
if (evaluation == null)
{
evaluation = Evaluate();
}
return evaluation;
}
}
如果我向TEvaluation 添加一个可为空的类型约束,我会得到:
"Circular constraint dependency involving TEvaluation and TEvaluation"
我可以解决这个问题的一种方法是:
evaluation = default;
这会起作用,但如果类型类似于Int32,则默认值为 0,这可能是允许的值,所以我不能拥有它。
我可以解决这个问题的另一种方法是向类型参数添加一个类约束,但这个抽象类的实现可能需要int 作为它的类型,并且由于上述默认解决方案的问题, 我觉得我做不到。
有没有一种方法可以让我拥有可以为 null 的值或引用类型?
【问题讨论】:
-
方法上的 Nullable
怎么样?公共抽象类 EvaluableState > where Nullable : IComparable > -
TEvaluation是类还是结构?你在使用新的 C#8 可空值吗? -
default通常是最好的选择。让调用者使用int或int?