2011-09-29 50 views
24

我的代碼如下:開關箱 - 一個恆定值,預計

public static void Output<T>(IEnumerable<T> dataSource) where T : class 
{ 
    dataSourceName = (typeof(T).Name); 
    switch (dataSourceName) 
    { 
     case (string)typeof(CustomerDetails).Name.ToString(); : 
      var t = 123; 
      break; 
     default: 
      Console.WriteLine("Test"); 
    } 
} 

但是,這是行不通的。案例陳述給我一個錯誤,說預計會有一個常量變量。請幫助你們,謝謝你!

+0

可能重複的[C# - 有沒有比這更好的替代'開啓類型'?](http://stackoverflow.com/questions/298976/c-is-there-a-better-alternative-than -this-to-switch-on-type) – 2011-09-29 06:42:35

回答

20

看到case語句 C# switch statement limitations - why?

基本上交換機不能評價了聲明。他們必須進行靜態評估。

+1

這在VB.net中是不正確的......我試圖轉換已經有這種情況值的代碼(基本上是方法調用) –

+3

@Moslem Ben Dhaou yes C#開關絕對不等同於VB Case語句。對於Case語句,您可以使用表達式(函數調用,變量等),而C#需要常量值(無函數調用,變量等)。 switch語句相當有限。 – deepee1

19

您只能匹配switch-statements中的常量。

例子:

switch (variable) 
{ 
    case 0: 
     //Code 
     break; 
    default: 
     //Code 
     break; 
} 

作品,但

switch (variable) 
{ 
    case sameothervarialbe: 
     //Code 
     break; 
    default: 
     //Code 
     break; 
} 

+11

作爲附加說明:「const int myConstant = 3」算作常量,但「readonly static int myReadonlyStatic = 3」不是。 – statue

1

開關是在這個意義上非常挑剔,在開關的值必須爲編譯時間常數。而且被比較的值必須是原始的(或現在的字符串)。爲此,您應該使用if語句。

原因可能會回到C處理它們的方式,因爲它會創建一個跳轉表(因爲這些值是編譯時常量),並且它會嘗試通過在您的情況下不允許評估值來複制相同的語義。

3

Johnnie,請通過msdn指南switch。此外,C#語言規範明確規定了編譯時間錯誤的情況下:

•如果開關表達式的類型爲sbyte,字節,短,USHORT, INT,UINT,長,ULONG,布爾,焦炭,字符串或枚舉類型,或者如果它是與這些類型之一相對應的可爲空的類型,那麼是 switch語句的控制類型。

•否則,恰好一個用戶定義的隱式轉換(第6.4節),必須 從開關表達式的類型存在於以下 可能的主導類型之一:爲sbyte,字節,短,USHORT,INT,UINT, long, ulong,char,string,或者與這些類型的 之一對應的可爲空的類型。

•否則,如果不存在這樣的隱式轉換,或者如果存在多於 存在一個這樣的隱式轉換,則會發生編譯時錯誤。

希望這會有所幫助。

3

您不能使用switch語句,因爲case值不能被計算表達式。爲此,您必須使用一個if/else ...

public static void Output<T>(IEnumerable<T> dataSource) where T : class 
{ 
    dataSourceName = (typeof(T).Name); 
    if(string.Compare(dataSourceName, typeof(CustomerDetails).Name.ToString(), true)==0) 
    { 
     var t = 123; 
    } 
    else if (/*case 2 conditional*/) 
    { 
     //blah 
    } 
    else 
    { 
     //default case 
     Console.WriteLine("Test"); 
    } 
} 

我還冒昧地整理了您的條件語句。撥打ToString()後不需要投射字符串。無論如何,這總是會返回一個字符串。在比較字符串的平等性時,請記住使用==運算符將導致區分大小寫的比較。最好使用string compare = 0和最後一個參數來設置開啓/關閉區分大小寫。