繁体   English   中英

可空 <Nullable> 或可选 <Nullable> 在C#中

[英]Nullable<Nullable> or Optional<Nullable> in C#

由于在这个问题上的第一个评论可能会是为什么以及为什么就是有可能使这不是一个重复的问题:我有一个值类型变量有三个有效状态(如果该事项十进制类型): has value | null | unspecified has value | null | unspecified has value | null | unspecified 最好在没有自定义类的情况下代表所有这三个状态。 同样, 0.0m和任何其他十进制值均有效。 不幸的是, Nullable<Nullable<decimal>>在C#中无效。 做这个的最好方式是什么?

更新:

埃里克(Eric)下面的评论使我对此有所不同。 作为软件架构师,上述问题的核心哲学问题是如何处理null可以代表多种含义的情况。 激发此问题的特定示例是:

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

现在,理所当然地,我们以严格的功能方式使用(滥用?)C#,结果是有时需求与C#的目的正交。 希望C#的下一个版本可以区分工会,这将是完美的选择。

如果你绝对,积极,不希望使用自定义类或枚举,我会说你最好的选择是使用KeyValuePair<decimal, T>其中T是你3个选择一定的代表性( string为“未指定” /“有值“ /” null“,根据需要为-1/0/1的int

我觉得这是很糟糕的做法,但是根据您对无自定义类的要求,这是我所拥有的最好的。

另一个非理想但可行的解决方案可能是使用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

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

最低版本可能如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM