可以将ReSharper [CanBeNull]和[NotNull]属性应用于Action或Func参数吗?

时间:2018-03-23 16:11:39

标签: c# attributes resharper generic-type-argument

ReSharper有一套代码注释,可用于显式表达IDE可以使用的代码意图。两个最有用的注释是/*Function to left rotate arr[] of siz n by d*/ void leftRotate(int arr[], int d, int n) { int i, j, k, temp; for (i = 0; i < gcd(d, n); i++) { /* move i-th values of blocks */ temp = arr[i]; j = i; while(1) { k = j + d; if (k >= n) k = k - n; if (k == i) break; arr[j] = arr[k]; j = k; } arr[j] = temp; } }[CanBeNull]属性,可以在构造函数,属性和方法上使用,如下所示:

[NotNull]

这是一个很长的镜头,但有没有办法可以将这些属性分配给Action或Func参数?

我理解以下代码是非法的(因为type arguments are not a valid target for attributes),但有没有另外一种表达方式?

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

1 个答案:

答案 0 :(得分:4)

如果您愿意创建自定义委托类型,则可以执行此操作:

    delegate void TextProcessor([NotNull] string text);

    delegate void NullableTextProcessor([CanBeNull] string text);

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

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

Delegates

不幸的是,CanBeNull似乎没有用lambda语法发出警告:

Calls

但您可能只想等待C#8的可空/不可空引用类型。