C# 6.0 功能不适用于 Visual Studio 2015

Posted

技术标签:

【中文标题】C# 6.0 功能不适用于 Visual Studio 2015【英文标题】:C# 6.0 Features Not Working with Visual Studio 2015 【发布时间】:2015-03-14 04:08:39 【问题描述】:

我正在使用 C# 6.0 测试 Visual Studio 2015,但语言功能不起作用。在 MVC Web 应用程序中,以下代码会编译:

if (!string.IsNullOrWhiteSpace(Model.Profile?.TypeName))

    // More logic here...

但是,当我通过 Debug 和 IIS Express 运行应用程序时,我收到以下错误:

CS1525:无效的表达式术语“。”

如何启用这些功能?

【问题讨论】:

这听起来像是 MVC 特定的(或至少是 ASP.NET 特定的)所以我添加了一个标签 - 因为 Visual Studio 本身清楚地知道 C# 6...你应该看看哪里您根据它所针对的 .NET 版本配置 MVC……可能有一些东西可以让您指定要使用的编译器。 也许您需要在 web.config 中为 roslyn codeprovider msdn.microsoft.com/en-us/library/y9x69bzw(v=vs.110).aspx 添加一个 compiler 元素? 这段代码是在 aspx 页面还是 Razor 页面中?还是 .cs 文件中的代码? @ErikFunkenbusch 它在 Razor 页面中。 是的,MVC5 与 Roslyn 不兼容 【参考方案1】:

这适用于 MVC 5(测试 5.2.3),您只需要添加 roslyn 代码 dom Nuget 包

.NET 编译器的 CodeDOM 提供程序...

使用新的 .NET 编译器平台(“Roslyn”)编译器作为服务 API 的替代 CodeDOM 提供程序。这为使用 CodeDOM 的系统中的新语言功能(例如 ASP.NET 运行时编译)提供了支持,并提高了这些系统的编译性能。

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

【讨论】:

这应该作为答案提交,因为它可以解决问题,而不必升级到 MVC 的 beta 版本。 @Deef 你不正确。 Microsoft.Net.Compilers 与 Msbuild 相关。 CodeDOM Providers 与 ASP.NET 和其他在运行时编译的 api 相关。 是的,你是对的。我误读/误解了,因为它们有时会用新名称替换包并将它们添加为依赖项。 可能值得一提的是重新启动 Visual Studio。我安装软件包后它一直在抱怨,但重新启动它就消失了:) @Rono,确保你的包源是nuget.org。从链接中可以看出,是正确的名称,并且包存在。【参考方案2】:

嗯,我有 MVC5,最近安装了 VS 2015。

我已经安装了 CodeDOM 提供程序包,但它没有帮助... 但在那之后我意识到,该软件包仅支持框架 4.5,而我在测试期间将目标框架设置为 4.6 - 虽然它适用于 4.5...

所以也要注意目标框架。如果您有 4.5 - 只需安装包 Microsoft.CodeDom.Providers.DotNetCompilerPlatform。但是如果你有 4.5.1-4.6 作为目标,你将不得不改变 web.config 部分

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
          <providerOption name="CompilerVersion" value="v4.0"/>
      </compiler>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

对于 C#,只需将 type 更改为:

type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 

【讨论】:

这确实帮助我让C# 6ASP.NET 4.6 一起工作,但最好用正确的type 来发布代码... 谢谢,这在我周二回家时一直有效,然后在我周四回来时无效。不知何故,这部分配置已经退出了,因为我记得在我最初让它工作时看到它!【参考方案3】:

我在 Visual Studio 2015 中遇到了同样的问题。这里的另一个答案暗示了我使用的解决方案,但他们错误地指定了修复程序并且从未给出澄清。

在 Visual Studio 菜单上,选择 Project,如果遇到此问题,您应该会看到子项 Enable C#6 / VB 14。选择此菜单子项。它将从 Nuget 下载正确的包并安装它们。在此之后,重新启动 Visual Studio 并重新加载您的解决方案。

我无法验证这是否也将 Project Properties > Build > Advanced > Language Version 选择修复为 C# 6,因此您可能还想在之后检查这个从菜单中启用 C# 6。

【讨论】:

这个子项目不在我的项目菜单中。我有 Unity 5.5.2,它打开了我的 VS 2015 社区来创建一些脚本。在向属性添加默认值时,红色取消线显示编译器错误,指出我需要 c# 6,因为当前加载了 C# v.4。每当我尝试选择项目的属性时,屏幕只会闪烁但没有页面出现。【参考方案4】:

检查您的项目属性,转到构建、高级并查看是否 C# 6.0,如果您没有将其作为默认设置。

目前完美支持 MVC5 和 C# 6.0,而且效果非常好!

【讨论】:

“C# 5 中不提供功能‘空传播运算符’。请使用语言版本 6 或更高版本。”不知道高级设置,但似乎在这里不起作用。 如何将默认版本改为6,这样我就不用在每个项目上都设置了? 定义“一些”。这在 vs 2015 更新 3 中不起作用。 当我进入项目属性时,我没有得到构建菜单。如果我转到“属性页面”,我会得到一个构建菜单,但构建屏幕上没有“高级”按钮。翻译,“这不起作用”(对我来说) 我的VS版本是Community 2015 Update 3 (14.0.25431.01)【参考方案5】:

包括遵循安装最新Microsoft.CodeDom.Providers.DotNetCompilerPlatform 的建议,我还必须将我的 root Web.config system.codedom 设置为此,以最终消除Visual Studio 2015 中的所有错误:

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

现在重启Visual Studio,应该就可以了。

【讨论】:

【参考方案6】:

Visual Studio 2015 还将在“项目”菜单中显示一个Enable C#6 / VB 14,并选择了一个 ASP.NET 网站/Web 应用程序。

这实际上会将Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.Compilers 包安装到您的项目中,并将适当的标签添加到web.config 文件中。

【讨论】:

什么网站标签?如果您的意思是属性/网络,则那里没有这样的功能。 在 Visual Studio 中,当您选择某个网站项目时,“网站”选项卡会出现在“查看”选项卡旁边。您可以在那里找到此功能。 我现在投了反对票,请编辑以澄清你的意思,例如通过添加屏幕截图。 我正在尝试解决网站问题,但该菜单项对我不可用。请注意,同一解决方案中的其他非 Web 项目使用 VB 14 功能没有问题。它们都以 .NET 4.7 为目标,我安装了 CodeDom 编译器。【参考方案7】:
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:7 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:15 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />

【讨论】:

以上是关于C# 6.0 功能不适用于 Visual Studio 2015的主要内容,如果未能解决你的问题,请参考以下文章

在 ActiveX dll 项目中创建列表(对象),在 Visual Basic 6.0 中用于 c# 项目

Visual Studio 智能感知/自动更正适用于 C# 术语,但不适用于 Unity

如何将 jpg 文件加载到 CBitmap (visual c++ 6.0) 中?

Visual Studio 的“自动解析”功能不适用于扩展方法 - 现在怎么办?

Visual Studio 自动完成功能不适用于 html 页面上的 javascript/css

从 Visual C# 2019 创建的 DLL 可以在 MFC 6.0 中使用吗?