我有一个类型为DateTime?
在一个函数中,我将其检查为null
并希望之后使用它,而不必每次调用?.
。在例如Kotlin IDE识别出类似的检查并断言变量之后不能是null
。有没有办法在C#中做到这一点?
DateTime? BFreigabe = getDateTime();
if (BFreigabe == null) return false;
TimeSpan span = BFreigabe - DateTime.Now;
//Shows Error because it.BFreigabe has the type DateTime?, even though it can't be null
修改
使用时
TimeSpan span = BFreigabe.Value - DateTime.Now;
相反,它在这种情况下 ,因为.Value
根本没有nullsafety。但是,考虑到即使没有空检查也会编译,只会产生错误,一般问题仍然存在。如何说服C#以前可以为空的变量不再可以为空?
修改2
在变量上投射DateTime。
TimeSpan span = (DateTime)BFreigabe - DateTime.Now;
仍然不像Kotlin那样安全,但足够相似。
答案 0 :(得分:2)
如果您有上一次检查,则可以访问该值。可空类型始终具有两个属性:HasValue
和Value
。
您可以转换为DateTime
(不使用?
)或使用value属性。
DateTime? BFreigabe = getDateTime();
if (!BFreigabe.HasValue == null)
return false;
TimeSpan span = BFreigabe.Value - DateTime.Now;
或者将可空变量存储在一个不可为空的变量中:
DateTime? BFreigabe = getDateTime();
if (BFreigabe.HasValue == null)
{
DateTime neverNull = BFreigabe.Value;
TimeSpan span = neverNull - DateTime.Now;
}
这将获得完整的编辑器支持,并保证没有NullReferenceExcpetion
。
编辑:因为您的问题是断言。断言通常意味着我们将抛出异常状态无效。
在这种情况下,省略检查nullness。如果您在var.Value
为空时访问var
,则会抛出NullReferenceException
。这会将责任转移给来电者。
另一种选择是不使用可空变量。通过转换它(参见第二个列表)或不接受Nullable类型作为参数。
function TimeSpan Calc(DateTime time)
{
// here we know for sure, that time is never null
}
答案 1 :(得分:0)
这个怎么样?
DateTime? BFreigabe = getDateTime();
if (!BFreigabe.HasValue) return false;
DateTime BFreigabeValue = BFreigabe.Value;
TimeSpan span = BFreigabeValue - DateTime.Now;
答案 2 :(得分:-1)
尝试将NULL值转换为任何值,这是无关紧要的。
DateTime? BFreigabe = getDateTime();
if (BFreigabe == null) return false;
TimeSpan span = (BFreigabe??DateTime.Now) - DateTime.Now;