【发布时间】:2011-06-17 13:12:30
【问题描述】:
我昨天发布了this 问题,询问有关将 ASP.NET 应用程序部署到 .NET 3.5 目标服务器的 C# 4 客户端和天气服务器上的 C# 3 编译的东西或客户端上的 C# 4。
那个场景是带有可选参数的。我知道自 .NET 1.1 起就支持可选参数。为什么 C#3 编译的 IL 代码不能使用可选参数调用 C#4 编译的 IL 代码?
C# 3 会忽略 optional 属性吗?
【问题讨论】:
我昨天发布了this 问题,询问有关将 ASP.NET 应用程序部署到 .NET 3.5 目标服务器的 C# 4 客户端和天气服务器上的 C# 3 编译的东西或客户端上的 C# 4。
那个场景是带有可选参数的。我知道自 .NET 1.1 起就支持可选参数。为什么 C#3 编译的 IL 代码不能使用可选参数调用 C#4 编译的 IL 代码?
C# 3 会忽略 optional 属性吗?
【问题讨论】:
可选参数仅在 4.0 版中引入 C#。 (它们在 VB 早期的 .NET 中可用)。
【讨论】:
你是对的...... 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
【讨论】:
我的简单猜测是因为基类库不同?这使得 C# 3.* 和 4.* 之间的差异比说 2.* vs 3.* 大得多,因为后者使用相同的 BCL。
虽然不确定。
【讨论】: