【问题标题】:C# CLR/Compiling QuestionC# CLR/编译问题
【发布时间】: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 属性吗?

【问题讨论】:

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


    【解决方案1】:

    可选参数仅在 4.0 版中引入 C#。 (它们在 VB 早期的 .NET 中可用)。

    【讨论】:

    • 我是从 IL 代码的角度提出这个问题的。我理解它的方式是使用最终在生成的 IL 代码中的属性应用可选参数。所以我基本上要求澄清当 C# 3 生成的 IL 代码尝试使用可选参数调用代码时会发生什么,在这种情况下 C# 4 生成的 IL,但我猜同样适用于早期的 VB 选项,即 C# 3 调用VB 使用可选的或 C# 3 调用 C# 4 生成的 IL 代码生成 IL 代码。
    【解决方案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

    【讨论】:

    • 谢谢你 - 这正是我想要的。
    【解决方案3】:

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

    虽然不确定。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多