我使用的是.NET 8,我有这样的界面:

public interface ISortableParams<T>
{
    public bool? Descending { get; set; }
    public T? OrderBy { get; set; }
}

当我try 这样实现它时:

public enum OrderBy
{
    None = 0,
    Name = 1,
    Email = 2,
}
public class Request : ISortableParams<OrderBy>
{
    public bool? Descending { get; set; }

    // This property (OrderBy) is not recognized as implementation
    // Because it has nullable '?'. If I remove it, it works.
    // But the enum might be null.
    // This happen because Enum is a class type.
    // Are nullable classes not recognized as implicit implementation?
    public OrderBy? OrderBy { get; set; } 
}
  • 我不想显式地实现该接口.

  • where T : struct可以解决这个问题,但我想保持它完全通用,不受限制:

public interface ISortableParams<T> 
 where T : struct // this makes it work, but I might use a class sometime.
{
    public bool? Descending { get; set; }
    public T? OrderBy { get; set; }
}
  • 如何解决?

推荐答案

至少部分解决你的问题:

此属性(OrderBy)不被识别为实现

将泛型参数更改为可空枚举(OrderBy?):

public class Request : ISortableParams<OrderBy?>
{
    public bool? Descending { get; set; }

    public OrderBy? OrderBy { get; set; } 
}

而且不需要任何约束.

这里的问题是,C#编译器对可空引用和可空值类型的处理是不同的(对于引用类型,可空性基本上是一个元数据,而对于值类型,它在类型系统中用Nullable<T> struct表示).

更多细节:

Csharp相关问答推荐

等待限制选项似乎不适用于频道

我可以 suppress 规则CS 9035一次吗?

如何将字节数组转换为字符串并返回?

将修剪声明放入LINQ中

具有单一导航属性的EF核心一对多关系

为什么在使用动态obj+类obj时会调用串联?

在swagger示例中添加默认数组列表

如何将字符串变量传递给JObject C#-无法加载文件或程序集';System.Text.Json

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

此异步方法在重写方法中缺少等待运算符警告

C#System.Commandline:如何向命令添加参数以便向其传递值?

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

如何将 colored颜色 转换为KnownColor名称?

WPF:如何从DatagridHeader的内容模板绑定到词典项

使DefaultIfEmpty返回空

在C#和HttpClient中使用REST API

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

LINQ在GROUP BY和JOIN之后获取子列表

如何在C#中用Serilog记录类路径、方法名和行编号

MudBlazor MudTabs-->;选项卡内容高度