【问题标题】:Covariance Also in 3.5 / 2.0?协方差也在 3.5 / 2.0 中?
【发布时间】:2012-03-01 21:37:51
【问题描述】:

奇怪的问题...

我已经从示例中实现了协方差。

我的目标 FW 是 4.0。

怎么会。我想看看它是否在 3.5 /2 上失败 -> 但它不会。

不可能,因为协方差来自 FW4.0。

更改为 3.0 后,我构建并查看:(+不会在运行时失败)

【问题讨论】:

  • 尝试使用framework 2.0(3.5)版本的编译器,而不是4.0的编译器。
  • @TetsujinnoOni 不改变目标 FW 就像在指定目标中工作?
  • 公共语言运行时和 C# 编译器 (csc.exe) 是两个独立的东西。 CLR 在 2.0 版本中引入了协变和逆变。直到版本 4 才将它们引入 C#。您正在使用 Compiler 4 构建版本 3 IL,这就是它起作用的原因。

标签: c# .net-4.0 covariance


【解决方案1】:

框架 3 支持协方差,但未在编译器中实现。您正在使用面向框架 3 的编译器 4。

这在 Eric Lippert 的一篇博文中有所提及,我会看看能不能找到它..

编辑

进一步澄清:公共语言运行时和 C# 编译器 (csc.exe) 是两个独立的东西。 CLR 在 2.0 版本中引入了协变和逆变。直到版本 4 才将它们引入 C#。您正在使用 Compiler 4 构建版本 3 IL,这就是它起作用的原因。

【讨论】:

  • 使用 .NET 3.0 或 3.5 编译器。
  • 我应该卸载 fw4 吗?是否有任何配置可以在干净模式 3.0 下工作?
  • 无需卸载,框架可以共存没问题。只需从命令行使用所需的编译器,或使用早期版本的 VS
  • 您正在寻找的博文是,奇怪的是,这一篇:blogs.msdn.com/b/ericlippert/archive/2012/01/02/…
  • 哈!是的,那个。计算机编程和幽默,一门棘手的混合体。
【解决方案2】:

CLR 从 2.0 版开始支持协变和逆变泛型类型参数。只是 C# 语言直到版本 4 才提供任何语法。

【讨论】:

  • 我不明白 fw2 如何支持它。从我读到的地方,它是在 4 时介绍的。
  • 包括 C# 在内的所有 .NET 语言都被翻译成相同的中间语言 IL(类似于 CLR 的汇编语言)。现在 IL 支持许多特性(如协变和逆变),但并非所有语言都提供语法来使用所有这些特性。使用此功能的 C# 语法已在版本 4 中添加。
  • 所以我没有办法失败吗? (即使我将 csc.exe 用于 2.0 ?)作为 myles 的答案?
  • 您可以按照他的说法使用旧的编译器(通过命令行或使用旧版本的VS),它会失败,因为旧的编译器无法识别新的语法。但是,您仍然不需要强迫它失败,因为如果旧项目引用您的 Dll,它们将简单地忽略协变/逆变。来自 CLI 规范:“不希望支持变体的语言可以忽略该功能,并将所有泛型类型视为非变体”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多