断言变量不是空的

时间:2017-07-26 12:24:49

标签: c# kotlin

我有一个类型为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那样安全,但足够相似。

3 个答案:

答案 0 :(得分:2)

如果您有上一次检查,则可以访问该值。可空类型始终具有两个属性:HasValueValue

您可以转换为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;