Nullable<Nullable> or Optional<Nullable> in C#

本文关键字:Nullable gt lt in Optional or | 更新日期: 2023-09-27 18:16:18

关于这个问题的第一个评论可能是为什么,为什么很可能使这个问题不重复:我有一个值类型变量(类型为十进制,如果重要的话),它有三种有效状态:has value | null | unspecified。最好不使用自定义类来表示这三种状态。此外,0.0m和任何其他十进制值都是有效的。不幸的是,Nullable<Nullable<decimal>>在c#中无效。最好的方法是什么?

更新:

Eric下面的评论让我对这个问题有了一点不同的看法。作为软件架构师来看上述问题,核心哲学问题是如何处理null可以表示多种含义的情况。引发这个问题的特定示例是:

在我们的系统中,有产品供应表(价格、最低订购量、一些用户定义值等)。表具有层次结构。为了计算子表中的出价值,需要考虑"父出价"。我们的想法是让null表示约束被删除的情况,而null(null)(由于缺乏更好的语法)表示父值没有变化。

现在,可以肯定的是,c#被我们以严格的功能方式使用(滥用?),结果是需求有时与c#的目的是正交的。希望c#的下一个版本能够区分联合,这将是完美的。

Nullable<Nullable> or Optional<Nullable> in C#

另一个不理想但可能可行的解决方案可能是使用Tuple<decimal?bool>:

Tuple.Create<decimal?, bool>(null, true); //specified null
Tuple.Create<decimal?, bool>(null, false); //unspecified null
Tuple.Create<decimal?, bool>(1.0m, true);  //specified value
Tuple.Create<decimal?, bool>(1.0m, false); //??? insanity

如果你绝对,积极地,不想使用自定义类或enum,我会说你最好的选择是使用KeyValuePair<decimal, T>,其中T是你的3个选项的一些表示(string为"未指定"/"有值"/"null", int为-1/0/1,如你所愿)

我觉得这是一个很糟糕的做法,但根据你的规格没有自定义类,这是我最好的。

我建议您自己编写这样的概念的实现。

最小版本可能是这样的:

sealed class Assignable<T>
{
    private readonly isAssigned;
    private readonly T value;
    public Assignable()
    {
    }
    public Assignable(T value)
    {
        this.value = value;
        this.isAssigned = true;
    }
    public T Value
    {
        get
        {
            if (!isAssigned) throw new InvalidOperationException();
            return value;
        }
    }
    public bool IsAssigned
    {
        get { return isAssigned; }
    }
}