2011-06-17 161 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