C# 自动实现的属性必须同时定义get和set访问器

C# 自动实现的属性必须同时定义get和set访问器,c#,sql-server,visual-studio-2015,sqlclr,c#-6.0,C#,Sql Server,Visual Studio 2015,Sqlclr,C# 6.0,SQLCLR Visual Studio 2015 我不熟悉编写CLR代码 编译SQL CLR函数时出现以下错误 我在用电话 有问题的代码是 public Datum.Datum Datum { get; } 在C控制台应用程序not CLR中编译时,使用Visual Studio 2015成功生成并执行相同的库 我的理解是,通过使用VisualStudio,我使用的是C v6 .sqlproj是否会强制使用早期版本的C?如果您不想使用C 6,请使用私有支持字段实现getter: public

SQLCLR Visual Studio 2015

我不熟悉编写CLR代码

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

我在用电话

有问题的代码是

public Datum.Datum Datum { get; }
在C控制台应用程序not CLR中编译时,使用Visual Studio 2015成功生成并执行相同的库

我的理解是,通过使用VisualStudio,我使用的是C v6


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

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

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

将_datum的值设置在类ctor、init method等内部的某个位置。

主要问题似乎是Visual Studio与.NET Framework/CLR之间的断开连接。visualstudio似乎可以更新为使用较新版本的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 微软公司版权所有。版权所有

此编译器是作为Microsoft R.NET Framework的一部分提供的,但仅支持C 5以下的语言版本,C 5不再是最新版本。有关支持较新版本C编程语言的编译器,请参阅

该链接将带您访问Roslyn的GitHub存储库。为了使事情更简单,这里是直接指向该页面的链接,从下载编译器部分开始,不下载Visual Studio,因为您已经有了:


如果从主菜单中单击“项目”,是否有“启用c6”选项?该属性为“自动”属性,只有get。如果它没有设置或任何返回某些内容的逻辑,那么您希望它如何返回任何内容。这就是为什么你会看到这个错误。如果缩进以从类内部设置此属性的值,则可以在属性中声明private set。或者在get中使用一些逻辑来返回一些值。@ChetanRanpariya C 6允许在不使用setter的情况下声明自动属性,例如,可以在ctor中分配自动属性。{get;private set;}怎么样?如果打开项目属性,请选择SQLCLR Build选项卡并打开Advanced。。。您可以从下拉列表中选择语言版本。如果您从默认更改为C 6.0并重新编译,您将得到一个错误,即/langversion的选项“6”无效;必须是ISO-1、ISO-2、3、4、5或默认值。这表明生成使用的是较旧的csc.exe编译器,而不是Visual Studio C编译器。我怀疑您需要编辑一些与SQL相关的.targets文件,以使其使用更好的csc.exe版本。这正是我想使用C6.0的原因,但我怀疑某些地方的设置,可能是sqlprof文件,可能会强制使用早期版本,或者SQL Server Data Tools 2015不支持C6.0,我不知道。