我使用的是.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相关问答推荐

C# Json重新初始化动态类型

无法将blob发送到Azure -缺少HTTP标头异常

C#使用属性和值将JSON转换为XML

将委托传递到serviceccollection c#web API

Polly v8—使用PredicateBuilder重试特定的状态代码

Int和uint相乘得到LONG?

如何将MongoDB序列化程序设置为内部对象属性

如何在C#中创建VS代码中的控制台应用程序时自动生成Main方法

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

EFR32BG22 BLE在SPP模式下与PC(Windows 10)不连接

Regex字母数字校验

.NET8Blazor-为什么Rapzor渲染在for循环之后显示?

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

用于请求用户返回列表的C#Google API

从HTML元素获取 colored颜色

除非首先访问使用的终结点,否则本地API上的终结点不起作用

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

在C#中删除多个不同名称的会话

当我在Git中暂存文件更改时,它们会消失

无法停止PowerShell中的低级挂钩(c#挂钩)