2014-02-24 56 views
1

我是要動態地返回一個類型的默認值,但是我無法將默認關鍵字傳遞給Type類型的變量。爲什麼我不能將Type變量傳遞給c#中的關鍵字「default」?

爲什麼不呢?

如:

private object GetSpecialDefaultValue(Type theType) 
    { 
     if (theType == typeof (string)) 
     { 
      return String.Empty; 
     } 
     if (theType == typeof (int)) 
     { 
      return 1; 
     } 
     return default(theType); 
    } 

給我的編譯時錯誤:

The type or namespace name 'theType' could not be found (are you missing a using directive or an assembly reference?)

+0

的[默認的編程當量(類型)](可能重複http://stackoverflow.com/questions/325426/programmatic-equivalent-of-defaulttype) – Mitch

+0

由於在編譯時解析了默認值。由於您在編譯時不知道您輸入的類型,因此它不起作用。 – Yev

回答

2

之所以default不採取Type一個實例是,有中IL沒有default指令。默認語法根據類型是否爲值類型轉換爲ldnullinitobj T

如果你想從Type默認值,執行相同的邏輯給出in this other question

public static object GetDefaultValue(Type t) 
{ 
    if (!t.IsValueType || Nullable.GetUnderlyingType(t) != null) 
     return null; 

    return Activator.CreateInstance(t); 
} 
5

您只能使用default與泛型類型參數。

The default keyword can be used in the switch statement or in generic code:

from default (C# Reference)

那個怎麼樣?

private object GetSpecialDefaultValue<T>() 
{ 
    var theType = typeof(T); 

    if (theType == typeof (string)) 
    { 
     return String.Empty; 
    } 
    if (theType == typeof (int)) 
    { 
     return 1; 
    } 
    return default(T); 
} 

更新

你可以試試下面的不是default,但我不是100%肯定它會工作

return theType.IsValueType ? (object)(Activator.CreateInstance(theType)) : null; 
+1

+1。請注意''default(SomeType)''可以在任何地方使用,但是在非泛型代碼中'null' /'new SomeValueType'可以給出更多的清晰度。 –

+0

如果只是爲了準確起見,我肯定會在你的文章中記下Alexi的評論。 – Hardrada

相關問題