编辑11月29日2020:.NET 5.0现在已经发布,但是如果要获取.NET标准2.1,仍然需要下面的解决方案
C# 9.0仍在开发中。有几个引用让我相信它现在应该是可测试的(至少其中一些)。
我使用VS 2019 16.7预览3.1。我选择语言版本作为项目的预览版。
我可以使用一些C# 9特性。喜欢:Dictionary<string, object> Stuff = new()
但是使用新的init
特性给了我一个错误:Error CS0518 Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported
我该怎么解决这个问题?
导致错误的代码示例:
class Test
{
public int Hello { get; init; }
}
和
record Test(int hello);
记录定义是简写的,并扩展为使用init
的东西,这就是它也受到影响的原因。
我链接到的语言跟踪页面上说,这个功能是Merged into 16.7p3
,我正在使用它。
我是不是太兴奋了?我需要等吗?或者现在有什么方法来处理这些特性:D
编辑(在注释中请求)-为.net 5.0控制台应用程序添加csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
编辑#2:在这里发布的解决方案- https://github.com/dotnet/roslyn/issues/45510
发布于 2020-06-30 11:12:06
这是当前预览版和最新的主分支(6月27日)中的一个bug。sharplab.io中的一个简单记录会创建相同的错误。
只需在项目中的某个地方添加缺少的类型即可。
using System.ComponentModel;
namespace System.Runtime.CompilerServices
{
[EditorBrowsable(EditorBrowsableState.Never)]
internal class IsExternalInit{}
}
记录和init
将无问题地工作。
只有LinqPad 6似乎没有问题,可能是因为它也包含了这种类型。
发布于 2021-09-14 18:31:42
如果不喜欢使用IsExternalInit
类丢弃每个项目,则可以使用Directory.Build.props
自动将文件引用为不可见的编译项:
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)IsExternalInit.cs" Visible="false" />
</ItemGroup>
</Project>
在解决方案的根目录中添加/编辑该文件,并在其中添加IsExternalInit.cs
文件。这样做将自动将该文件添加到所有项目中。
相对于解决方案的示例文件夹结构:
.
├── Directory.Build.props
├── IsExternalInit.cs
└── Solution.sln
发布于 2021-02-10 11:57:59
借用Panagiotis Kanavos,您实际上可以将IsExternalInit
声明为记录本身(自我实现预言):
using System.ComponentModel;
namespace System.Runtime.CompilerServices
{
[EditorBrowsable(EditorBrowsableState.Never)]
public record IsExternalInit;
}
https://stackoverflow.com/questions/62648189
复制相似问题