C#泛型类:从可空类型参数中推断非空类型

5

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

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

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

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;
}

3
你应该考虑使用属性来表示 nullability,而不是使用 !? 符号。因为可空值类型和引用类型的实现方式完全不同,所以没有一种简单的通用方法来处理这两者。 - Lasse V. Karlsen
1个回答

5
使用 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.

哦,我刚意识到我也需要它用于像Action<T>或自定义委托这样的代理。至少对于引用类型是可能的吗? - Liero
这似乎是一个不错的选择,但这些属性在 .Net Framework 中不可用。有没有什么提示可以在 .Net Framework 中使用它们? - Sebastian Schumann
你可以自己定义它们 - 只要确保它们是内部的。 - Yair Halberstadt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接