我们可以在C#8.0中使用Records吗?
c#
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);
但是我遇到了很多编译错误,因为这种定义类的语法显然是不正确的。
这些文章有误导性吗?
是使用记录升级到 C# 9.0,进而升级到 .NET 5.0 的唯一方法吗?
回答
我有一个使用 .NET Standard 2.1 和 .NET core 3.1 的项目 - 所以 C# 版本是 8.0
不正确。在默认的C#版本是8.0,但你可以使用任何你喜欢的语言版本(只要你有正确的编译工具和编译SDK),只需改变语言版本。最简单的方法是在 csproj 中:
<PropertyGroup>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
有一些注意事项:
- 某些功能需要额外的类型定义,早期框架中将缺少这些功能,但可以手动添加或通过额外的 nuget 包引用添加;在记录的情况下,这可能需要
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
{
}
}
然后记录类型应该是netstandard2.0兼容的,这意味着它们也可以在 .NET 4.8 下工作。