C#CLR /编译问题

时间:2011-06-17 13:12:31

标签: c# .net c#-4.0 c#-3.0 clr

我昨天发布了this问题,询问了一个C#4客户端将ASP.NET应用程序部署到.NET 3.5目标服务器,并在服务器上编译了C#3或客户端上的C#4。

那个场景是可选参数。我知道自.NET 1.1以来一直支持可选参数。为什么C#3编译的IL代码无法使用可选参数调用C#4编译的IL代码?

C#3是否只是忽略了可选属性?

3 个答案:

答案 0 :(得分:4)

仅在版本4.0中向C#引入了可选参数。 (它们早先在VB中可用于.NET)。

答案 1 :(得分:2)

你说得对...... IL只是用OptionalAttributes装饰,但它是调用编译器决定做什么......

来自里希特:

  

现在,当编译器发现你有代码调用缺少某些参数的方法时,编译器可以确保你省略了可选的争论,从元数据中获取它们的默认值,并嵌入它们......

所以这是 CALLING 编译器决定做什么与选项,而不是被调用的c#4.0 IL ...

有关边缘情况的更多内容以及决定值的调用方法如何在Lippert中找到,@ http://blogs.msdn.com/b/ericlippert/archive/2011/05/16/optional-argument-corner-cases-part-three.aspx

答案 2 :(得分:1)

我的简单猜测是因为基类库不同?这使得C#3 *和4. *之间的区别大于2. * vs 3. *,因为后者使用相同的BCL。

不确定。