2011-06-17 175 views
3

我發佈了this問題昨天詢問有關C#4客戶端將.NET應用程序部署到.NET 3.5目標服務器,並且天氣預報C#3在客戶端上編譯了某些東西或C#4。C#CLR /編譯問題

該方案帶有可選參數。我知道可選參數自.NET 1.1以來一直得到支持。爲什麼C#3編譯的IL代碼無法使用可選參數調用C#4編譯的IL代碼?

C#3是否忽略可選屬性?

回答

2

你說得對......的IL只是裝飾瓦特/ OptionalAttributes,但它的調用編譯器,決定該怎麼辦...

從裏希特:

現在,當編譯器看到你有代碼調用一個缺少某些參數的方法,編譯器可以確保你省略可選argumements,抓住他們的默認值了元數據,並且將它們嵌入...

所以它的呼喚編譯器決定做什麼瓦特/自選,而不是所謂的C#4.0 IL ...

更具優勢的情況下,它怎麼就這麼定值可以從利珀特找到調用的方法,@http://blogs.msdn.com/b/ericlippert/archive/2011/05/16/optional-argument-corner-cases-part-three.aspx

+0

謝謝你 - 這正是我正在尋找的。 – 2011-06-17 14:45:06

1

我簡單的猜測是因爲基類庫是不同的?這使得C#3. *和4. *之間的差別比2. *和3. *大得多,因爲後者使用相同的BCL。

雖然不確定。

4

可選參數僅在版本4.0中引入到C#中。 (它們早在VB中可用於.NET)。

+0

我我從IL準則的角度提出這個問題。我理解它的方式是使用最終生成的IL代碼中的屬性來應用可選參數。所以我基本上是要求澄清當C#3生成的IL代碼嘗試使用可選參數來調用代碼時發生的情況,在這種情況下,C#4生成IL,但我猜測對於早期的VB可選代碼,即C#3調用VB使用可選或C#3調用生成的IL代碼生成IL代碼。 – 2011-06-17 13:52:09