2017-07-26 49 views
2

我有型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

的可變作品鑄造日期時間。

TimeSpan span = (DateTime)BFreigabe - DateTime.Now; 

仍然不如Kotlin那樣安全,但也足夠相似。

+1

替換'時間跨度跨度= BFreigabe - DateTime.Now;''與時間跨度跨度= BFreigabe.Value - DateTime.Now;'' –

+0

BFreigabe.Value - DateTime.Now'或'BFreigabe.GetValueOrDefault() - DateTime.Now' – DavidG

+0

我不明白你的第一個** Edit **的含義,你在這個代碼之前檢查了'null',所以無論如何它不會爲空,但是當你使用'nullable'類型時你工作不正確寫'BFreigabe - DateTime.Now'。因此,當你檢查一個變量時,沒有什麼和nullsafety –

回答

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.Valuevar爲空,則會拋出NullReferenceException。這將責任移交給呼叫者。

另一種選擇是不使用可爲空的變量。通過轉換它(請參見第二個列表)或不接受Nullable類型作爲參數。

function TimeSpan Calc(DateTime time) 
{ 
    // here we know for sure, that time is never null 
} 
+0

我已經通過將DateTime轉換爲變量解決了這個問題 – Looki

-1

嘗試將NULL值轉換爲任何值,這是無關緊要的。

DateTime? BFreigabe = getDateTime(); 
if (BFreigabe == null) return false; 
TimeSpan span = (BFreigabe??DateTime.Now) - DateTime.Now; 
0

這個怎麼樣?

DateTime? BFreigabe = getDateTime(); 
if (!BFreigabe.HasValue) return false; 
DateTime BFreigabeValue = BFreigabe.Value; 
TimeSpan span = BFreigabeValue - DateTime.Now;