2009-04-18 20 views

回答

7

最簡單的方法是在代碼中使用if/else。除此之外,這使得讀者更清楚,這就是你想要發生的事情,而不是使用開關。

編輯:好吧,所以可讀性對你並不重要 - 但基本上如果你想編譯的代碼改變,源代碼將不得不改變。您可以使用Mono編譯器並自行修改它,但我懷疑是否有任何方法讓Microsoft編譯器有效地忽略您正在使用switch語句。

+0

switch語句由詞法分析器生成,因此可讀性不受關注。重寫發生器產生if/else's是最後的手段:) – user55017 2009-04-18 11:02:44

2

您是否嘗試了不同的編譯器(即單聲道),或試圖將您的違規類放在單獨的程序集中並切換爲其他語言?

0

你如何讓編譯器做到這一點? 我與VS2008測試:

public static int DoSomething(int i) { 
    switch (i) { 
     case 1: return 0; 
     case 100: return 1; 
     case 1000: return 2; 
     default: return 3; 
    } 
} 

編譯爲:

.method public hidebysig static int32 DoSomething(int32 i) cil managed 
{ 
    .maxstack 2 
    .locals init (
     [0] int32 CS$1$0000, 
     [1] int32 CS$4$0001) 
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: stloc.1 
    L_0003: ldloc.1 
    L_0004: ldc.i4.1 
    L_0005: beq.s L_0016 
    L_0007: ldloc.1 
    L_0008: ldc.i4.s 100 
    L_000a: beq.s L_001a 
    L_000c: ldloc.1 
    L_000d: ldc.i4 0x3e8 
    L_0012: beq.s L_001e 
    L_0014: br.s L_0022 
    L_0016: ldc.i4.0 
    L_0017: stloc.0 
    L_0018: br.s L_0026 
    L_001a: ldc.i4.1 
    L_001b: stloc.0 
    L_001c: br.s L_0026 
    L_001e: ldc.i4.2 
    L_001f: stloc.0 
    L_0020: br.s L_0026 
    L_0022: ldc.i4.3 
    L_0023: stloc.0 
    L_0024: br.s L_0026 
    L_0026: ldloc.0 
    L_0027: ret 
} 

沒有開關指示在那裏。

也許你應該向微軟提交一個錯誤?

+0

我沒有編譯器可用的ATM,但如果爲值爲1-1000的3個case開關創建了跳轉表,我會感到震驚(因此1000項)。可能與案例1更接近:案例50: – user55017 2009-04-18 12:16:48

0

不,您無法控制C#編譯器如何發出CIL指令。即使可以,AOT或JIT編譯器也可能將CIL指令翻譯爲本地機器代碼指令,這些指令與您預期的高級編譯器優化相比會有很大不同。