Bas*_*sie 10 c# record c#-8.0 c#-9.0
我有一个使用 .NET Standard 2.1 和 .NET core 3.1 的项目 - 所以 C# 版本是 8.0
根据我发现的几篇文章(例如one , two),应该可以record使用以下语法定义类型:
public class MyRecord(string Input1, int Input2);
Run Code Online (Sandbox Code Playgroud)
但是我遇到了很多编译错误,因为这种定义类的语法显然是不正确的。
这些文章有误导性吗?
是使用记录升级到 C# 9.0,进而升级到 .NET 5.0 的唯一方法吗?
Mar*_*ell 16
我有一个使用 .NET Standard 2.1 和 .NET core 3.1 的项目 - 所以 C# 版本是 8.0
不正确。在默认的C#版本是8.0,但你可以使用任何你喜欢的语言版本(只要你有正确的编译工具和编译SDK),只需改变语言版本。最简单的方法是在 csproj 中:
<PropertyGroup>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
有一些注意事项:
IsExternalInit,PMF 向您展示了如何定义,这里是使用记录升级到 C# 9.0,进而升级到 .NET 5.0 的唯一方法吗?
不; 您需要 .NET 5 构建 SDK,但您仍然可以面向 .NET Core 3.1 等。
为避免错误Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported,只需在项目中的任何位置添加以下代码:
using System.ComponentModel;
namespace System.Runtime.CompilerServices
{
/// <summary>
/// Reserved to be used by the compiler for tracking metadata.
/// This class should not be used by developers in source code.
/// This dummy class is required to compile records when targeting .NET Standard
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public static class IsExternalInit
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后记录类型应该是netstandard2.0兼容的,这意味着它们也可以在 .NET 4.8 下工作。