2

我有以下扩展方法,我正在尝试用属性装饰out参数(T value) 。NotNullWhen但是,它显示错误“NotNullWhen 属性由于其保护级别而无法访问”,我不知道为什么?

    using System;
    using System.Collections.Generic;
    using System.Diagnostics.CodeAnalysis;

    internal static class Extensions
    {
        public static bool TryGetValueForAssignableType<T>(this IDictionary<Type, T> dictionary, Type key, [NotNullWhen(true)] out T value)
        {
            value = default;

            foreach (var pair in dictionary)
            {
                if (pair.Key.IsAssignableFrom(key))
                {
                    value = pair.Value;
                    return true;
                }
            }

            return false;
        }
    }

我尝试将类访问修饰符更改为public无效。我还nullable为类库启用了 C# 8 上下文。

知道如何解决这个问题吗?

编辑:

我刚刚尝试使用上面的扩展类创建一个新的类库。现在它显示'找不到命名空间名称'NotNullWhen'的类型(您是否缺少 using 指令或程序集引用)'。我已经包括using System.Diagnostics.CodeAnalysis;了,但它是灰色的。项目文件包含以下内容:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Nullable>enable</Nullable>
    <LangVersion>8.0</LangVersion>
  </PropertyGroup>

</Project>
4

1 回答 1

7

如果您的开放文档,您将看到NotNullWhenAttribute适用于:

  • .NET 5.0、6.0 预览版 6
  • .NET 核心 3.1 3.0
  • .NET 标准 2.1

TBH 我也未能针对其构建 lib ,但您可以尝试安装像这样.NET Standard 2.1的 nuget或自己实现此属性(就像在运行时完成一样),因为 AFAIK 编译器通常依赖于命名和/或鸭子类型。

于 2020-05-03T12:46:57.107 回答