我们可以在 C# 8.0 中使用 Records 吗?

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)

有一些注意事项:

  1. 某些功能需要额外的类型定义,早期框架中将缺少这些功能,但可以手动添加或通过额外的 nuget 包引用添加;在记录的情况下,这可能需要IsExternalInit,PMF 向您展示了如何定义,这里
  2. 某些功能需要运行时功能,无法运行在早期的框架上,比如新的默认接口实现特性
  3. 不会得到微软的任何支持——如果它有效,那就太好了;如果没有;嗯

是使用记录升级到 C# 9.0,进而升级到 .NET 5.0 的唯一方法吗?

不; 您需要 .NET 5 构建 SDK,但您仍然可以面向 .NET Core 3.1 等。


PMF*_*PMF 7

为避免错误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 下工作。