【问题标题】:Why do I get compilation error when trying to use record type in C#?为什么在 C# 中尝试使用记录类型时会出现编译错误?
【发布时间】:2021-06-14 23:54:51
【问题描述】:

编辑:谢谢大家!我从未升级到更新版本的 .NET 和之前的语言版本。因此不知道 .csproj 配置。即使我在发布问题之前进行了研究 我自己无法找到解决方案。所以,我只留下这两个 供进一步参考的链接,也许这也可能对某人有所帮助。

https://docs.microsoft.com/en-us/dotnet/standard/frameworks

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

我已升级到 .NET 5.0.301

终于有时间在C# 9.0

中尝试记录类型

我写了一个简单的代码,但在编译过程中出错。

我使用 Visual Studio Code 作为编辑器。

VS Code 版本 1.57.0

C#扩展版本1.23.12

这是我的 settings.json

"editor.semanticHighlighting.enabled": true,
"csharp.semanticHighlighting.enabled": true,
"omnisharp.path": "latest"

设置:

dotnet new sln -n "Test"
dotnet new console -n "TestProject"
dotnet sln Test.sln add  .\TestProject\TestProject.csproj

我的代码:

using System;

namespace TestProject
{

    class Program
    {
        static void Main(string[] args)
        {
            var person = new Person() { Name = "Tom" };
            person.Name = "Bob";
            Console.WriteLine(person.Name);
        }
    }

    public record Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

}

问题:

CS0246 The type or namespace name 'Person' could not be found (are you missing a using directive or an assembly reference?)
CS0246 The type or namespace name 'record' could not be found (are you missing a using directive or an assembly reference?)
CS0548 '<invalid-global-code>.Person': property or indexer must have at least one accessor
CS1513 } expected
CS0116 A namespace cannot directly contain members such as fields or methods
CS1022 Type or namespace definition, or end-of-file expected

非常感谢任何帮助

【问题讨论】:

  • 我对 VS Code 了解的不够多,无法回答。但是错误消息非常清楚地表明,您没有正确配置事物以使用支持record 作为关键字的 C# 版本。您需要仔细检查您使用的代码版本是否正确,以及您的项目是否已正确配置为使用 C# 9 功能。
  • 提供的代码在 VS2017 下用 struct 而不是 record 编译得很好:项目属性中的 Framework Target 是什么?正如所问和回答的那样:.NET 5 或更低版本?但是构建设置中的语言版本标签是什么? 9 或 8 或 7 或更少?使用的是最后一个大调还是小调? stackoverflow.com/questions/44699125/…
  • 当你得到它的工作时,你可以将你的记录缩写为public record Person(string Name, int Age)
  • 升级到不同版本的 Net 时,请确保您进行了干净的构建。像您这样的错误可能是由两个问题引起的。一个是代码未编译,并且您的 Net 版本不匹配.第二个原因是VS在识别时自动升级并且由于缺少库而导致不同版本的Net失败。在找到第一个丢失的库后升级中止,因此并非所有库版本都被更改,您必须手动修改版本.简单的解决方案是从解决方案资源管理器参考中删除库。然后再次添加将更新版本。
  • 谢谢大家! TargetFramework 和 LangVersion 属性的 .csproj 配置确实有问题。

标签: c# compiler-errors record .net-5 c#-9.0


【解决方案1】:

在 .csproj 文件中检查您的目标框架和语言版本。你应该找到类似的东西:

<TargetFramework>net5.0</TargetFramework>
<LangVersion>9.0</LangVersion>

如果您没有找到这些属性,请将它们添加到 &lt;PropertyGroup&gt;...&lt;/PropertyGroup&gt; 标记中。如果它们设置为旧版本,请更改它们。

如果这不能解决您的问题,可能是您的 .NET SDK 安装不正确,或者您可能将其安装在默认目录以外的目录中,而 VS Code C# 扩展无法找到它。

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多