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#中无效。最好的方法是什么?
null
可以表示多种含义的情况。引发这个问题的特定示例是:
在我们的系统中,有产品供应表(价格、最低订购量、一些用户定义值等)。表具有层次结构。为了计算子表中的出价值,需要考虑"父出价"。我们的想法是让null
表示约束被删除的情况,而null(null)
(由于缺乏更好的语法)表示父值没有变化。
现在,可以肯定的是,c#被我们以严格的功能方式使用(滥用?),结果是需求有时与c#的目的是正交的。希望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; }
}
}