Можно ли применить атрибуты ReSharper [CanBeNull] и [NotNull] к аргументу Action или Func?

В ReSharper есть набор аннотаций кода, полезных для явного выражения намерений кода, которые могут использоваться в среде IDE. Двумя наиболее полезными аннотациями являются атрибуты [CanBeNull] и [NotNull], которые можно использовать в конструкторах, свойствах и методах, например:

[CanBeNull]
private Foo DoSomething([NotNull] string text)
{
    // ...
}

Это долгий путь, но можно ли каким-либо образом назначить эти атрибуты параметру Action или Func?

Я понимаю, что следующий код является незаконным (поскольку аргументы типа не являются допустимой целью для атрибутов), но есть ли альтернативный способ выразить это?

private void DoSomething(Action<[NotNull]string> processText)
{
    ///...
}

person Wheelie    schedule 23.03.2018    source источник
comment
Бьюсь об заклад, вы могли бы создать собственный тип делегата и применить атрибут к параметру.   -  person StriplingWarrior    schedule 23.03.2018
comment
Чтобы проиллюстрировать комментарий @StriplingWarrior: delegate void TextProcessor([NotNull]string text)   -  person vc 74    schedule 23.03.2018


Ответы (1)


Вы можете сделать это, если хотите создать собственный тип делегата:

    delegate void TextProcessor([NotNull] string text);

    delegate void NullableTextProcessor([CanBeNull] string text);

    private void DoSomething([NotNull] TextProcessor processText)
    {
        // ...
    }

    private void DoSomethingNull([NotNull] NullableTextProcessor processText)
    {
        // ...
    }

Делегаты

К сожалению, CanBeNull, похоже, не выдает предупреждений в синтаксисе лямбда:

Звонки

Но вы можете просто подождать ссылочных типов C# 8, допускающих или не допускающих значение NULL.

person StriplingWarrior    schedule 23.03.2018