断言变量不是空的
我有一个类型为DateTime?
的变量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
根本没有任何的安全。 然而,考虑到即使没有空检查也会编译,只是产生一个错误,一般的问题仍然存在。 如何说服C#前一个可空变量不能再空?
编辑2
在变量上投射日期时间。
TimeSpan span = (DateTime)BFreigabe - DateTime.Now;
仍然不如Kotlin那样安全,但是足够相似。
如果您有以前的检查,您可以访问该值。 可空类型总是有两个属性: 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
。
编辑 :因为你的问题状态断言 。 断言通常意味着我们将抛出一个异常的状态是无效的。
在这种情况下,省略对空值的检查。 如果在var
为null时访问var.Value
,则会抛出NullReferenceException
。 这将责任移交给呼叫者。
另一个选择是不使用可空变量。 可以通过转换(参见第二个列表)或不接受Nullable类型作为参数。
function TimeSpan Calc(DateTime time) { // here we know for sure, that time is never null }
这个怎么样?
DateTime? BFreigabe = getDateTime(); if (!BFreigabe.HasValue) return false; DateTime BFreigabeValue = BFreigabe.Value; TimeSpan span = BFreigabeValue - DateTime.Now;
尝试将NULL值转换为任何值,这是无关紧要的。
DateTime? BFreigabe = getDateTime(); if (BFreigabe == null) return false; TimeSpan span = (BFreigabe??DateTime.Now) - DateTime.Now;