【问题标题】:C# Nullable Type Parameter from Class or Value来自类或值的 C# 可空类型参数
【发布时间】: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 通常是最好的选择。让调用者使用intint?
  • 这能回答你的问题吗? Nullable type as a generic parameter possible?

标签: c# generics nullable


【解决方案1】:

根据您的问题陈述,您希望在需要时评估一次并存储结果以供将来使用。这是 - 惰性语义:

protected Lazy<TEvaluation> evaluation = new Lazy<TEvaluation>(() => Evaluate(...)); 

public TEvaluation GetEvaluation() => evaluation.Value; 

很难以线程安全的方式实现惰性求值,而Lazy&lt;T&gt; 为您完成了大部分繁重的工作。

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多