【问题标题】:Why don't we have multiple compilers to check "compatible" with?为什么我们没有多个编译器来检查“兼容”?
【发布时间】:2017-08-19 13:19:52
【问题描述】:

您知道,C# 现在到了 7.1,具有许多新的语法和功能(称为“语法糖”)。

但是这些糖在以前的版本中是不能吃的,比如 VS2013、VS2012 或 VS2010。如果你复制源代码并将它们放在那里,显然肯定有很多错误,因为那里的编译器无法识别它们。不同的VS可能有不同种类的编译器。

如果我们想让我们的代码与不同类型 VS 中的不同编译器“兼容”(例如:如果我想编写适合 VS2010.我首先将我的编译器切换到 VS2010 的编译器并进行编写)。这样会更好吗?

【问题讨论】:

  • 因为是编译器读取你的代码并编译它。框架不参与其中。如果您使用 VS2017 进行编译,那么这些“语法糖”表达式不会有很多问题。 C# 或 vb.net 的 syntax 与 net framework 的版本一致 完全错误
  • @Steve:因为不同种类的编译器有不同种类的语法。为什么我们不为 VS 产品嵌套不同的编译器,这样我们就可以知道我们在较低的编译器中写的“兼容”是否可以通过?
  • 据我所知,您可以在同一台机器上拥有不同版本的 VS(以及编译器)。
  • 但你确实拥有它。项目 > 属性 > 构建选项卡 > 高级按钮 > 语言版本。

标签: c# .net syntax


【解决方案1】:

原问题

使用低网络框架和编译器的高级语法 在最新的VS中,可以编译成功,为什么?

Matt Warren's blog entryEric Lippert's 一样,是关于这个问题的好读物。

尽管如此,一个常见的技术是让编译器 从高级语言特征“降低”到低级语言 相同语言的功能。

简而言之,“较新”功能被转换 ('lowered') 为“较旧”功能 - 因此它们继续在框架上运行(即使它没有新功能的概念)。

using 的 Roslyn 源代码是降低的示例(它将using 转换为try finally):

/// <summary>
/// Rewrite a using statement into a try finally statement.  Two forms are possible:
///   1) using (expr) stmt
///   2) using (C c = expr) stmt
///   
/// The former is handled by RewriteExpressionUsingStatement and the latter is handled by
/// RewriteDeclarationUsingStatement (called in a loop, once for each local declared).
/// </summary>

奖金问题

如果我们想制作,为什么我们没有多个编译器供我们切换 我们的代码与不同种类的不同编译器“兼容” VS(例如:如果我想编写适合 VS2010 的纯代码。我 首先将我的编译器切换到 VS2010 的编译器并进行编写)。那是 会更好吗?

只要您使用的是 VS 2013 或更高版本,您就可以轻松做到这一点。从 VS 2013 开始,C# 编译器在 standalone 可用。

此外,您一般不需要这样做,因为 Visual Studio 允许您specify the compiler version

【讨论】:

  • 其实我真正想问的是我在上面做了什么改变(而且一开始我并没有说清楚)。但是你的一些回答给了我深入理解“降低”的建议。所以“+1”会投给你。
  • 查看@xqMogvKW上方的Bonus question
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
相关资源
最近更新 更多