清除 NuGet 缓存后,LanguageVersion 不包含 C# 9 的定义

LanguageVersion does not contain a definition for C# 9 after clearing NuGet caches

在 Visual Studio 2022 年使用 EF Core 和 Npgsql 创建 ASP.NET Core 6 MVC 应用程序。

点击

中的“清除所有 NuGet 缓存”按钮后
Visual Studio > Tools Options > NuGet Package Manager > General

属性 Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp9 源代码

CSharpParseOptions.Default.WithLanguageVersion(Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp9);

抛出编译错误

Error CS0117 'LanguageVersion' does not contain a definition for 'CSharp9'

所有 NuGet 包都是最新的。如何解决这个问题?汇编信息不包含CSharp9成员:

#region Assembly Microsoft.CodeAnalysis.CSharp, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// location unknown
// Decompiled with ICSharpCode.Decompiler 6.1.0.5902
#endregion

namespace Microsoft.CodeAnalysis.CSharp
{
    //
    // Summary:
    //     Specifies the language version.
    public enum LanguageVersion
    {
        //
        // Summary:
        //     C# language version 1
        CSharp1 = 1,
        //
        // Summary:
        //     C# language version 2
        CSharp2 = 2,
        //
        // Summary:
        //     C# language version 3
        //
        // Remarks:
        //     Features: LINQ.
        CSharp3 = 3,
        //
        // Summary:
        //     C# language version 4
        //
        // Remarks:
        //     Features: dynamic.
        CSharp4 = 4,
        //
        // Summary:
        //     C# language version 5
        //
        // Remarks:
        //     Features: async, caller info attributes.
        CSharp5 = 5,
        //
        // Summary:
        //     C# language version 6
        //
        // Remarks:
        //     Features:
        //     • Using of a static class
        //     • Exception filters
        //     • Await in catch/finally blocks
        //     • Auto-property initializers
        //     • Expression-bodied methods and properties
        //     • Null-propagating operator ?.
        //     • String interpolation
        //     • nameof operator
        //     • Dictionary initializer
        CSharp6 = 6,
        //
        // Summary:
        //     C# language version 7.0
        //
        // Remarks:
        //     Features:
        //     • Out variables
        //     • Pattern-matching
        //     • Tuples
        //     • Deconstruction
        //     • Discards
        //     • Local functions
        //     • Digit separators
        //     • Ref returns and locals
        //     • Generalized async return types
        //     • More expression-bodied members
        //     • Throw expressions
        CSharp7 = 7,
        //
        // Summary:
        //     C# language version 7.1
        //
        // Remarks:
        //     Features:
        //     • Async Main
        //     • Default literal
        //     • Inferred tuple element names
        //     • Pattern-matching with generics
        CSharp7_1 = 701,
        //
        // Summary:
        //     C# language version 7.2
        //
        // Remarks:
        //     Features:
        //     • Ref readonly
        //     • Ref and readonly structs
        //     • Ref extensions
        //     • Conditional ref operator
        //     • Private protected
        //     • Digit separators after base specifier
        //     • Non-trailing named arguments
        CSharp7_2 = 702,
        //
        // Summary:
        //     C# language version 7.3
        CSharp7_3 = 703,
        //
        // Summary:
        //     C# language version 8.0
        CSharp8 = 800,
        //
        // Summary:
        //     The latest major supported version.
        LatestMajor = 2147483645,
        //
        // Summary:
        //     Preview of the next language version.
        Preview = 2147483646,
        //
        // Summary:
        //     The latest supported version of the language.
        Latest = int.MaxValue,
        //
        // Summary:
        //     The default language version, which is the latest supported version.
        Default = 0
    }
}

Microsoft.CodeAnalysis.CSharp.dll 文件未直接从任何项目引用。

NuGet window 不显示名称中包含 roslyn 的任何包。

该错误清楚地表明您使用的是包含枚举的旧版本 DLL,在 C#9 可用之前。

只需升级您项目中的包以使用最新的包,它应该可以正常工作。这是该软件包的最新版本:

如果无法手动升级,请检查项目依赖关系树的间接依赖关系,并升级顶部引用旧包的任何包。您可以通过在解决方案资源管理器中浏览项目依赖项节点中的依赖项来完成此操作。

另一种查找确切引用“有问题”(在本例中为旧)dll 的项目的方法是 windows 在解决方案文件夹中按 DLL 名称进行搜索,并检查差异文件大小:通常,不同的版本会有不同的大小,这样你就可以在你的项目中比较它们,并与 NuGet 的包进行比较。