C#泛型类:从可为空的类型参数中推断不可为空的类型

问题描述

我使用C#8可为空的引用类型。

我有一个通用类,可以接受可为空的引用类型作为类型参数。

是否有一种方法可以基于可能是可为空的引用类型(甚至是可为空的结构)的泛型类型参数声明不可为空的类型?

abstract class Selector<T>
{
    T SelectedItem;

    // how to make item parameter not nullable?
    abstract string Format(T! item);

    // how to make item parameter not nullable?
    Func<T!,string> FormatFunction;
}

解决方法

使用DisallowNullAttribute

using System.Diagnostics.CodeAnalysis;

abstract class Selector<T>
{
    T SelectedItem;

    public abstract string Format([DisallowNull] T item);
}

var selector = default(Selector<string?>)!;
selector.Format(null); //warning CS8625: Cannot convert null literal to non-nullable reference type.