2010-04-23 66 views
15

我想知道什麼?在C#中意味着什麼?
我看到的東西是:DateTime?int?。我想這是特定於C#4.0?
我不能在谷歌找它,因爲我不知道這個東西的名字。
問題是我使用DateTime,並且我有很多鑄造錯誤(從DateTimeDateTime?)。C# - 基本問題:什麼是'?'?

謝謝

+9

這不是新的;自.NET 2.0以來就一直存在。 – Randolpho 2010-04-23 14:40:15

+0

不要與傳統的C if-then-else運算符混淆,x <0? 「 - 」:「+」 – Qwertie 2010-04-23 16:02:23

回答

33

要編寫Nullable<int>Nullable<DateTime>的簡寫。 Nullablesvalue types一起使用,它們不能爲空(它們始終有一個值)。

它不是特定於C#4的方式。

只能分配一個int?int如果它有一個值,那麼你的代碼將不得不做這樣的事情:

int? n = 1; 
int i = n ?? default(int); //or whatever makes sense 

還要注意Nullable有兩個屬性,HasValueValue你可以使用測試,如果已經設置了一個值並獲得實際值。

+3

int i = n ??默認(INT); – 2010-04-23 14:43:38

+0

@Brian Gideon,你是完全正確的,我只是想說明一個Nullable具有這兩個屬性。 – 2010-04-23 14:46:33

+0

@ klausbyskov:指出這些屬性是很好的,但是你已經在一個例子中給出了它們,它們是一個糟糕的選擇 - 也許你可以分別記下它們,並使用'??'來分配'int' 。 – 2010-04-23 14:59:47

12

這意味着它是一個nullable type

它允許您爲值類型(如int和DateTime)分配一個空值。它對數據庫中可選字段等內容非常有用。

5

?是一個空值類型它一直在C#。

可以使用??運算符將其值類型混合:

const int DefaultValue = -1; 

// get a result that may be an integer, or may be null 
int? myval = GetOptionalIdFromDB(); 

// the value after ?? is used if myval is null 
int nonNullable = myval ?? DefaultValue; 

可空類型可以比較空,所以上面的簡寫:

if(myval != null) { 
    nonNullable = myval.Value; 
} else { 
    nonNullable = DefaultValue; 
} 

但我更喜歡??

1

有點遺憾:[編輯:顯然這只是有時會發生]

// nullable type properties may not initialize as null 
private int? foo; // foo = 0 

// to be certain, tell them to be null 
private int? foo = null; 
+0

這不是我的經驗:你能用主要方法和所有東西發佈完整的repro嗎?像這樣: static class程序 { private static int?一世; public static void Main() Console.WriteLine(i); } } – 2010-04-23 16:03:31

+0

實際上,你是對的......當我在Snippet Compiler中進行直線測試時,它初始化爲null。當我在代碼隱藏頁中編寫代碼時,從另一個公共密封類訪問屬性時,我已經看到它們初始化爲它們的值類型默認值。我將不得不更深入地瞭解何時/爲何發生這種情況。 -1 from myself! – Matt 2010-04-23 17:36:27

1

這是一種聲明通用類Nullable<T>的實現的簡寫方式,其中T是非空值類型。

所以

int? i = null; 

相同

Nullable<int> i = null; 

正如上面提到的Nullable<T>暴露HasValue屬性,所以你可以檢查是否i有它的工作之前的值。

有意思的是:如果你將Nullable<int> i = 3;轉換爲對象,則可以將其轉換回int或Nullable<int>,因爲它在裝箱前有一個值。但是,如果您將Nullable<int> i = null;轉換爲對象,則在將其重新轉換爲int時會得到NullReferenceException,但您可以將其重新轉換爲Nullable<int>

1

正如其他人所說,在一個類型的名稱後,它表示可以爲空的類型。

?也用於條件操作符。

int max = x > y ? x : y 

這相當於:

int max; 
if(x > y) 
{ 
    max = x; 
} 
else 
{ 
    max = y; 
}