【问题标题】:Automatically implemented properties must define both get and set accessors自动实现的属性必须同时定义 get 和 set 访问器
【发布时间】:2017-09-27 12:02:23
【问题描述】:

SQLCLR Visual Studio 2015

我是编写 CLR 代码的新手。

编译 SQL CLR 函数时出现以下错误

我正在使用.Net Coordinates library

有问题的代码是

public Datum.Datum Datum { get; }

在 C# 控制台应用程序(不是 CLR)中编译时,相同的库可以使用 Visual Studio 2015 成功构建和执行。

我的理解是,通过使用 Visual Studio,我使用的是 C# v6。

.sqlproj 是否会强制使用 C# 的早期版本?

【问题讨论】:

  • 如果您从主菜单中单击项目,是否有“启用 c#6”选项?
  • 该属性为自动属性,只有get。如果它没有设置或任何返回某些东西的逻辑,你如何期望它返回任何东西。这就是您看到此错误的原因。如果您打算从类内部设置此属性的值,那么您可以在属性中声明私有集。或者在 get 中有一些逻辑来返回一些值。
  • @ChetanRanpariya C# 6 允许在没有设置器的情况下声明自动属性,例如可以在 ctor 中分​​配它们。
  • '{ get; 怎么样?私人集;}'?
  • 如果您打开项目属性,选择“SQLCLR Build”选项卡并打开“Advanced...”,您可以从下拉列表中选择语言版本。如果您从“default”更改为“ C# 6.0”并重新编译,您将收到错误消息“/langversion 的选项 '6' 无效;必须是 ISO-1、ISO-2、3、4、5 或默认值”。这表明构建使用的是较旧的 csc.exe 编译器,而不是 Visual Studio C# 编译器。我怀疑您需要编辑一些与 SQL 相关的 .targets 文件,以使其使用更好的 csc.exe 版本。

标签: c# sql-server visual-studio-2015 sqlclr c#-6.0


【解决方案1】:

主要问题似乎是 Visual Studio 和 .NET Framework / CLR 之间的脱节。似乎可以更新 Visual Studio 以使用较新版本的 C#,而与您计算机上实际存在的任何新版本无关。

不应该需要在高级 SQLCLR 构建属性中指定使用 C# 6.0,但是这样做会给您一个有见地的错误消息:

/langversion 的选项“6”无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

查看输出消息(假设级别足够高)应该表明您正在使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe,所以.sqlproj 文件或 SSDT 似乎没有在这里强制执行任何操作。但是,如果你进入命令提示符,进入包含 Csc.exe 的文件夹并直接运行它(即在提示符处只是 Csc),你应该会看到以下内容注意:

Microsoft (R) Visual C# 编译器版本 4.6.1590.0
对于 C# 5
版权所有 (C) 微软公司。版权所有。

此编译器作为 Microsoft (R) .NET Framework 的一部分提供,但仅支持 C# 5 以下的语言版本,该版本不再是最新版本。对于支持较新版本 C# 编程语言的编译器,请参阅http://go.microsoft.com/fwlink/?LinkID=533240

该链接会将您带到 Roslyn 的 GitHub 存储库。为方便起见,这里是直接指向该页面的链接,从下载编译器部分开始,无需下载 Visual Studio(因为您已经拥有了):

https://github.com/dotnet/roslyn#download-c-and-visual-basic

【讨论】:

    【解决方案2】:

    如果您不想使用 C# 6,请使用私有支持字段实现 getter:

    public Datum.Datum Datum { get {return _datum; } }
    private Datum.Datum _datum;
    

    在类中的某处设置_datum 的值(ctor,init 方法,...)。

    【讨论】:

    • 这就是我想使用 C#6.0 的东西,但我怀疑某处的设置,可能是 sqlprof 文件,可能会强制使用早期版本,或者 SQL Server Data Tools 2015 可能没有不支持C#6.0,我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多