处理可空类型的正确方法是什么,例如' DateTime?&#39 ;?当你需要选择可以为空的2个日期中较小的一个并且其中一个为空时,<或者>不能将null与实际日期结果比较为false,例如:
DateTime? function( DateTime? a, DateTime? b ){
return a < b ? a : b;
}
如果a或b为空,将返回b。
我是否必须使用if语句或是否有解决方法?
编辑:如果其中一个值为null,我希望不返回
编辑:我很抱歉,如果我使用某个功能作为示例令人困惑。这不是我想避免使用if语句。但是,在可以为空的DateTimes之间进行了大量的比较,我希望避免创建需要进行explicti调用等的自定义比较器。
是否可以覆盖默认的DateTime?比较
答案 0 :(得分:3)
DateTime? function( DateTime? a, DateTime? b ){
if(!a.HasValue && !b.HasValue)
throw new ArgumentNullException();
else if(!a.HasValue)
return b;
else if(!b.HasValue)
return a;
return a.Value < b.Value ? a : b;
}
逻辑:
null
,则抛出异常。null
,则返回另一个。null
,则返回小于另一个。答案 1 :(得分:3)
您可以使用Nullable.Compare。
static DateTime? GetLowerDateTime(DateTime? a, DateTime? b)
{
int val = Nullable.Compare(a, b);
if (val < 0) return a ?? b;
if (val > 0) return b ?? a;
return a; //whichever you want to return if they're equal
}
答案 2 :(得分:2)
您需要弄清楚在调用函数的每种情况下您想要发生什么,然后编写代码来执行该操作。我有点担心你正在寻找&#34;变通办法&#34; to&#34;写if语句&#34;,好像某种if
陈述是邪恶的,你不应该使用它们?不要试图聪明或偷偷摸摸 - 你可能正在编写一个需要工作和可维护的应用程序,而不是进入代码高尔夫比赛。
相反,您应该遵循this answer中的优秀建议:指明您的函数需要如何工作,然后完全实现规范。要清晰准确。
您的函数有四种可能的输入组合,您需要确定每个输入的返回值。从您的编辑中,您似乎希望函数尽可能频繁地返回非null值,这样可以简化:
function(a, b)
:返回a
中的任何一个,b
更小。function(a, null)
:必须返回a
function(null, b)
:必须返回b
function(null, null)
:必须返回null
所以,我们写下:
DateTime? function( DateTime? a, DateTime? b )
{
// Case 1.
if (a.HasValue && b.HasValue)
{
return a < b ? a : b;
}
// Case 2
if (a.HasValue)
{
return a;
}
// Case 3 & 4
return b;
}
答案 3 :(得分:1)
这应该适合你:
DateTime? function( DateTime? a, DateTime? b ){
return a < b ? a : (b ?? a);
}
??是空合并运算符。结帐msdn:null-coalescing operator。
编辑:删除冗余代码