【问题标题】:Can't write an expression-bodied function member无法编写表达式体函数成员
【发布时间】:2017-02-04 07:44:56
【问题描述】:

注意:这似乎是与 SSDT 项目一起使用的编译器的问题,它显然已在 2017 RC 中修复。我的问题类似于here. 描述的问题

我有一些代码拒绝让我将其编写为表达式体函数成员。简而言之,我想这样做:

void foo() => bar();

但 IDE 大发雷霆,要求我这样写:

void foo() { bar(); }

我的意思是肯定的,这是两个额外的字符,但我不确定它为什么抱怨,错误也没有意义。它给了我以下 3 个错误:

  • CS0000: ;预计
  • CS0000:方法必须有返回类型。
  • CS0000:需要标识符。

完整的代码如下所示。

public static void foo() => bar("some param"); // Errors on this line.
static void bar(string myParam) { //20 lines of code } 

我已经在 C# 交互式窗口中对此进行了测试,一切都可以正确编译和运行。我在代码中找不到任何不可打印的字符。

这是使用 VS 2015 社区,目标框架为 4.6.1

完整代码:

using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public partial class Triggers
{

    private const string ConnectionString = "context connection = true";

    private const string ReadInsertedTable = @"
    SELECT ID,
           (
               SELECT *
               FROM inserted AS b
               WHERE a.ID = b.ID
               FOR XML RAW, ELEMENTS XSINIL
           )
    FROM inserted AS a
";
    [SqlTrigger(Name = "Person_Insert", Target = "Person", Event = "FOR INSERT")]
    public static void Person_Insert() => AuditInsert(TableName); //  All errors here.

    private const string TableName = "Person";

    private static void AuditInsert(string tableName)
    {

        using (var readConnection = new SqlConnection(ConnectionString))
        using (var writeConnection = new SqlConnection(ConnectionString))
        {
            using (var readCommand = new SqlCommand(ReadInsertedTable, readConnection))
            {
                readConnection.Open();
                using (var reader = readCommand.ExecuteReader())
                {
                    SqlContext.Pipe.Send((reader));
                }
            }
        }
    }
}

更新:代码使用 msbuild 实用程序编译,但在 Visual Studio 中仍然失败。

【问题讨论】:

  • 我已经将你的代码复制到我的 vs 并且编译没有错误
  • 知道从哪里开始尝试解决这个问题吗?因为 CS0000 甚至看起来都不是一个正常的代码。我将从我的 IDE 中添加一个图像。
  • 你用的是什么版本的VS?请注意,表达式主体成员是 C#6 的功能,因此它不适用于旧 IDE
  • VS2015 Community w/Update 3.
  • 重要的是您要提及您在哪个环境中工作。在 Visual Studio 2015/2017 中,您可以通过 NUGET 包管理器 -> 管理解决方案包将新的编译器功能添加到项目中。打开它并浏览Microsoft.Net.Compilers。然后将其添加到项目中并单击安装。对Microsoft.CodeDom.Providers.DotNetCompilerPlatform 执行相同的操作。关闭 NUGET 并重建您的项目。

标签: c# visual-studio-2015 sql-server-data-tools


【解决方案1】:

这与罗斯林有关。尝试运行:

非罗斯林: https://dotnetfiddle.net/LJm1Fj

罗斯林: https://dotnetfiddle.net/aMUsj0

我怀疑您的项目文件或您的 Visual Studio 安装有问题,因为 VS2015 应该默认使用基于 Roslyn 的编译器。

我会尝试:

  • 使用上面小提琴中的代码创建一个新项目
  • 如果它编译然后比较 *.csproj 文件中的差异,主要是 ToolsVersion <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 和目标 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  • 您还应该查看 VS 中的 Output->Build 窗口并检查正在启动的可执行文件,在我的例子中:C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /platform:anycpu32bitpreferred /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:\Program Files (x86)\Reference ... Using shared compilation with compiler from directory: C:\Program Files (x86)\MSBuild\14.0\bin
  • 如果不能编译,建议重新安装.NET和VS

【讨论】:

  • 看起来它使用的是旧的编译器。我得到的 csc.exe 在 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe 下。知道怎么改吗?
  • 您是否尝试过按照我的建议创建原版项目?我认为项目文件中会有一些差异,大概在目标部分。或者可能在项目文件中设置了特定的语言版本(项目属性 -> 构建 -> 高级 -> 语言版本)。
  • @Jake 当您按照rocky 的第一条评论(即项目属性-> 构建-> 高级-> 语言版本)进行操作时,您会看到什么?对于您的项目类型,下拉列表是否只有 C# 5.0 以上的版本?
  • 我在 Build with an SSDT 项目下没有 Advanced。
  • @Jake 我可以重现你所看到的!如果我创建一个新项目并选择“SQL Server 数据库项目”,它会创建一个.sqlproj 文件,而不是.csproj 文件。如果在该 SSDT 项目中我添加一个新项目并选择“SQL CLR C#”“类”,并在生成的 C# 文件中使用任何 C# 6.0 功能(也尝试使用带有初始化程序的自动属性,int P { get; set; } = 42;),当我尝试“构建解决方案 (F6)”时出现奇怪的错误
【解决方案2】:

这个答案在很大程度上是无关紧要的。

正如提问者自己发现的那样,在用户 rocky 的帮助下,问题是没有构建 SQL Server 数据库项目 (.sqlproj)(与 .csproj 类型的其他项目不同)使用新的 C# 6.0 编译器,至少在 Visual Studio 2015 中没有。提问者Usage of wrong compiler during SQL Server Database Project building 链接的线程有一些细节。


旧答案:

在您的图片中,常量声明:

private const string TableName = "Person";

不见了。但是,您还没有从AuditInsert 方法中删除tableName 参数。

【讨论】:

  • 代码很好,这似乎是用于 SSDT 项目的编译器的问题。显然它已在 2017 RC 中修复,但我不会很快安装它。 :-)
  • @Jake 如果在任何地方都没有定义TableNameAuditInsert(TableName) 怎么可能会好起来?我在看你的照片。
  • 该图像只是为了表明错误出现了,因为 Maksim 说它对他来说编译得很好。我们已经确定这是一个编译器问题,而不是代码问题。我正在相应地更新我的主要问题,并提供相关问题的链接。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2015-04-09
相关资源
最近更新 更多