C#中的Nullable <nullable>或Optional <nullable>

时间:2016-11-04 19:59:11

标签: c# nullable optional

由于关于这个问题的第一个评论可能是为什么以及为什么这可能使这不是一个重复的问题:我有一个值类型变量(如果重要,则为十进制类型),它有三个有效状态:{{1 }}。最好在没有自定义类的情况下表示所有这三种状态。此外,has value | null | unspecified和任何其他十进制值都有效。不幸的是,0.0m在C#中无效。这样做的最佳方式是什么?

更新:

埃里克在下面的评论让我对此有所不同。作为软件架构师,在上述问题中,核心哲学问题是如何处理Nullable<Nullable<decimal>>可以表示多重含义的情况。推动这个问题的具体例子是:

在我们的系统中,有一些表格包含产品(价格,最小订单数量,一些用户定义的值等)。这些表具有层次结构。为了计算子表中的商品值,&#34;父母提供&#34;需要考虑。我们的想法是null表示已删除约束的情况,null(缺少更好的语法)表示不更改父值。

现在,被授予,C#被我们以严格的功能方式使用(滥用?),结果是需求有时与C#的目的正交。希望下一版本的C#具有歧视性的工会,这对于此非常适合。

3 个答案:

答案 0 :(得分:0)

如果你绝对,积极地,不想使用自定义类或枚举,我会说你最好的选择是使用KeyValuePair<decimal, T> T代表你的3个选项({{ 1}}表示“未指定”/“有值”/“空”,string表示-1/0/1,如你所愿)

我觉得这是非常糟糕的做法,但根据你没有自定义课程的规格,这是我所拥有的最好的。

答案 1 :(得分:0)

另一个非理想但可能可行的解决方案可能是使用元组&lt; decimal?,bool&gt;:

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

答案 2 :(得分:0)

我建议你自己编写这样的概念。

最小版本可能如下所示:

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; }
    }
}