C# 6.0 是不是适用于 .NET 4.0?
Posted
技术标签:
【中文标题】C# 6.0 是不是适用于 .NET 4.0?【英文标题】:Does C# 6.0 work for .NET 4.0?C# 6.0 是否适用于 .NET 4.0? 【发布时间】:2015-05-09 09:51:23 【问题描述】:我创建了一个示例项目,使用 C#6.0 的好东西 - 以空值传播和属性初始化为例,设置目标版本 .NET 4.0 并且它...有效。
public class Cat
public int TailLength get; set; = 4;
public Cat Friend get; set;
public string Mew() return "Mew!";
class Program
static void Main(string[] args)
var cat = new Cat Friend = new Cat();
Console.WriteLine(cat?.Friend.Mew());
Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
Wikipedia says C# 6.0 的 .NET 框架是 4.6。
This question(和 Visual Studio 2015 CTP 测试)说 CLR 版本是 4.0.30319.0。
This MSDN page 表示 .NET 4、4.5、4.5.2 使用 CLR 4。没有任何关于 .NET 4.6 的信息。
这是否意味着我可以在面向 .NET 4.0 的软件中使用 C# 6.0 功能?有什么限制或缺点吗?
【问题讨论】:
.Net 版本 2.0 - 3.5 使用 CLR v2.0。较新的版本使用 CLR v4.0。 请记住,明智地进行优化:您正在像这样为每只猫添加单独的 if-null-check 天哪。我一直在开发针对 v4.6 的 WCF,只是为了“提醒”生产服务器要到 2018 年才能升级。我认为一个月的工作需要几天的重构。五分钟后完成。谢谢微软! :D 【参考方案1】:是的(大部分情况下)。 C# 6.0 需要新的 Roslyn 编译器,但新的编译器可以针对较旧的框架版本进行编译。这仅限于不需要框架支持的新功能。
例如,虽然您可以将 C# 6.0 中的字符串插值功能与早期版本的 .Net 一起使用(因为它会导致调用 string.Format
):
int i = 3;
string s = $"i";
您需要 .Net 4.6 才能将其与 IFormattable
一起使用,因为只有新框架版本添加了 System.FormattableString
:
int i = 3;
IFormattable s = $"i";
您提到的案例不需要框架中的类型即可工作。所以编译器完全有能力支持旧框架版本的这些功能。
【讨论】:
其实你不需要.Net 4.6,只是在里面添加了几个类型。您可以自己将它们添加到旧框架中。 This code works fine on .Net 4.0 and 3.5. 是否有一个列表可以查看哪些 C# 6 功能在 .NET 4.0 中有效?另一种提问方式是:哪些新功能需要框架支持,哪些不需要? @Rubenisme 除了IFormattable
字符串插值之外,我想不出另一个。
我想我们可以说所有语法糖都可以使用并针对较旧的框架版本。可以这么说吗?
@mkb 是的。语法糖正是那些仅依赖于编译器功能而不依赖于框架功能的功能。【参考方案2】:
只想专注于如何理解***和其他链接。
当 Wikipedia 说 C# 6.0 与 .NET Framework 4.6 一起使用时,它仅仅意味着编译器的生产版本 (msc.exe) 将成为 .NET Framework 4.6 版本的一部分。通过multi-targeting,此类编译器可以支持较低版本的 .NET Framework 版本。当然,由于 Roslyn 成为了一个开源项目,编译器现在完全是一个单独的组件。
当某些东西引用 4.0.30319(.0) 的 CLR 版本时,它实际上可以是 .NET Framework 4.* (4.0, 4.0.*, 4.5, 4.5.*, 4.6, 4.6.*),因为它们都实现了 CLR 版本 4 规范。更不用说 Xamarin/Mono 也实现了相同的 CLR 规范。
MSDN 页面尚未完全更新,但some page 已经在版本信息部分列出了 .NET Framework 4.6。
总而言之,语言规范(以及 C# 编译器)、CLR 规范和 .NET Framework 版本之间的耦合并不紧密。它确实为开发人员提供了足够的灵活性,可以利用新编译器来针对较旧的 CLR 和 .NET 框架。
【讨论】:
【参考方案3】:是的,您可以为较旧的框架使用较新的编译器并访问新的编译器功能(只要这些功能不需要 .NET 4.6 中引入的新类型)。
这方面的其他示例是使用 C# 4.0 (.NET 4.0) 引入的具有默认参数的方法,但您可以在 .NET 2.0 (C# 2.0) 和 .NET 3.5 (C# 3.0) 项目中使用它们。
您还可以使用 .NET 2.0 或 .NET 3.0 if you do one small workaround 中的扩展方法(在 C# 3.0 中引入)使编译器满意,以便它可以找到在 .NET 3.5 中引入的属性。
【讨论】:
【参考方案4】:如果您正在使用构建脚本,请记住更改新构建器的路径:
设置 CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
[重建.bat]
set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal
if %errorlevel% neq 0 goto ERROR
REM call deploy Release //Things like deploy files..
goto END
:ERROR
echo ERROR: %errorlevel%
pause
:END
【讨论】:
【参考方案5】:@oobe 的回答实际上很重要。只有在使用 C:\Program Files (x86)\MSBuild\14.0\Bin 中的 MSBuild.exe 后,我才能通过批处理文件构建我的解决方案。
【讨论】:
以上是关于C# 6.0 是不是适用于 .NET 4.0?的主要内容,如果未能解决你的问题,请参考以下文章
C# 控制台应用程序 ReadLine() 适用于 .NET 4.7.2 而不是 .NET 5(在 dotnetfiddle 上)
实体框架寻找 ADO.NET 提供程序 SqlServerCe.3.5 而不是 4.0
Entity Framework 6 是不是支持 .NET 4.0?
哪些 GPS 加密狗适用于 Windows 7 和 .Net 4.0 System.Device.Location 命名空间?