Как устранить ошибку «Атрибут NotNullWhen недоступен из-за уровня защиты» - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующий метод расширения, и я пытаюсь украсить параметр 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 безрезультатно. У меня также включен контекст C# 8 nullable для библиотеки классов.

Есть идеи, как решить эту проблему?

Редактировать:

Я только что попытался создать новую библиотеку классов только с классом расширений выше. Теперь он отображает «Тип имени пространства имен« 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>

1 Ответ

1 голос
/ 03 мая 2020

Если ваша открытая документация вы увидите, что NotNullWhenAttribute относится к:

  • . NET 5 Preview 1
  • . NET Core 3.1 3.0
  • . NET Стандарт 2.1

TBH Мне также не удалось собрать lib для .NET Standard 2.1, но вы можете попробовать установить nuget, например this или реализуйте этот атрибут самостоятельно (, как это делается во время выполнения ), потому что компилятор AFAIK довольно часто полагается на присвоение имен и / или утку, на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...