【问题标题】:Target .Net 4.5 in VS2015 but I am allowed to use C# 6 features?VS2015 中的目标 .Net 4.5 但我可以使用 C# 6 功能吗?
【发布时间】:2016-09-05 08:12:00
【问题描述】:

我正在 VS2015 中开发一个针对 .Net 框架 4.5 的项目

在构建设置中,语言版本设置为“默认”

正如我所读到的,C# 6 仅在 .Net 4.6 中添加,但我AM允许(至少,代码编译和运行)使用string interpolation 功能,该功能我读过的是 C# 6 功能。

现在我很困惑:我现在是为 C# 6 / .Net 4.6 还是为 .Net 4.5 编译(我该如何检查?)

编辑

在 cmets 中,我看到 C# 6 语法与 .NET 框架版本无关。 我从这个答案 (What are the correct version numbers for C#?) 中得到了这个想法,据说'C# 6.0 随 .NET 4.6 和 VS2015 一起发布(2015 年 7 月)。所以我知道 C# 6 (以某种方式)耦合到 .NET 4.6

【问题讨论】:

  • C# 6.0 语法由编译器解释,与框架无关。如果你使用VS2015,它的编译器就可以完成任务
  • 这只是语法糖......编译后CLR应该是一样的......
  • @user3185569 我已经阅读了该项目,但这并不能回答我的问题
  • @ConstantinTreiber 这并不完全正确,但只要你不使用FormattableString 我同意。 .net 4.6 有一个名为FormattableString 的新功能,请阅读:stackoverflow.com/a/34859921/5962841 了解更多信息。通常你不应该关心这个。
  • @Steve 也阅读了我的评论

标签: c# visual-studio-2015 c#-6.0


【解决方案1】:

字符串插值等 C# 6 功能是编译器 功能,而不是运行时 (CLR) 功能。因此,无论您构建的 .NET 版本是什么,只要您的编译器支持 C# 6,您都可以使用它们。

在 Visual Studio 2015 中,您可以在 Properties => Build tab => Advanced button => Language Version 中控制所针对的语言版本

【讨论】:

  • 好的,所以当我读到字符串插值是 C# 6 的特性时,这不是真的吗?
  • @Michel 是真的,但是编译器把它改成了String.Format,这样就可以在.NET 4.5 上正常运行了。
  • 和编译器版本;什么决定了我使用的版本?这只是我使用的 VS 版本吗?
  • @Michel 编译器随 Visual Studio 一起提供。例如,如果您在运行 VS 2012 时需要使用 C# 6.0 编译器,则需要添加 Nuget 包,因为 VS 2012 不附带 C# 6.0 编译器:nuget.org/packages/Microsoft.Net.Compilers
  • 从上面复制我的评论:@user3185569 这并不完全正确,但只要你不使用FormattableString 我同意。 .net 4.6 有一个名为FormattableString 的新功能,请阅读:stackoverflow.com/a/34859921/5962841 了解更多信息。通常你不应该关心这个。
【解决方案2】:

通常,C# 编译器的新版本与 .Net Framework 的新版本同时发布。但是 C# 编译器不依赖于您使用的框架的版本,而是依赖于特定的类型和存在的成员。这些类型包含在新框架中,但它们也可以来自其他地方。

例如,这就是为什么您可以在 .Net 4.0 上使用 C# 5.0 async-await,使用 the Microsoft.Bcl.Async package

特别是对于 C# 6.0,基本字符串插值不需要任何新的类型或成员,因此不需要新的框架版本。这段代码:

string s = $"pie is {3.14}";
Console.WriteLine(s);

编译为:

string s = string.Format("pie is {0}", 3.14);
Console.WriteLine(s);

在 .Net 4.5 上运行良好。

另一方面,字符串插值的一个高级功能是插值后的字符串可以转换为IFormattableFormattableString。例如这段代码:

IFormattable formattable = $"pie is {3.14}";
Console.WriteLine(formattable.ToString(null, CultureInfo.InvariantCulture));
Console.WriteLine(formattable.ToString(null, new CultureInfo("cs-CZ")));

编译为:

IFormattable formattable = FormattableStringFactory.Create("pie is {0}", 3.14);
Console.WriteLine(formattable.ToString(null, CultureInfo.InvariantCulture));
Console.WriteLine(formattable.ToString(null, new CultureInfo("cs-CZ")));

这在 .Net 4.6 上编译良好,但在 .Net 4.5 上编译失败:

错误 CS0518:未定义或导入预定义类型“System.Runtime.CompilerServices.FormattableStringFactory”

但您可以通过包含以下代码使其编译:

namespace System.Runtime.CompilerServices
{
    class FormattableStringFactory
    {
        public static IFormattable Create(string format, params object[] args) => null;
    }
}

当然,使用这个虚拟实现,下面的代码会抛出一个NullReferenceException

您实际上可以通过引用 the unofficial StringInterpolationBridge package 使其工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多