如果这会影响答案,我正在使用C#10和VS2022.

我试图编写一个类来包含具有各种约束的参数.基类型不应为null,一些参数(如default)也不应为null,而其他一些参数则应为null(我将根据需要判断它们是否为null).我找不到一种方法在课堂上以任何方式混合这些类型.

我最初认为可以将T定义为notnull,然后使用T?对于任何我希望为null的属性,虽然我可以定义类/函数,但试图调用代码的方式无法编译.

    public class Parameter<T> where T : notnull {
        public T Value { get; set;}
        public T? Min { get; set; }

        public void Set(T? value_) 
        {
        }
    }

Parameter<int> parameter = new();
parameter.Set(null);

如果我在类中通过VS2022判断Set,它会正确地显示Set(T?value\uu1)作为参数,但如果我判断参数.Set它显示Set(int值),然后拒绝编译上述用法:

Argument 1: cannot convert from int? to int

我曾考虑将可为null的属性定义为T2,并允许其为null,但我遇到了一个问题,即我无法比较或分配t和T2,这将无法达到目的.

我是否错过了一些愚蠢的事情,或者是否有其他方法可以做到这一点?

推荐答案

由于您在 comments 中指出:

我的所有用法(如上所述)都是值类型(int、float、bool为主)

只需使用struct generic constraint:

where T : struct-类型参数必须是不可为null的值类型.有关可为null的值类型的信息,请参见Nullable value types.因为所有值类型都有一个可访问的无参数构造函数,所以struct约束意味着new()约束,不能与new()约束组合.不能将struct约束与unmanaged约束组合.

public class Parameter<T> where T : struct {
    public T Value { get; set;}
    public T? Min { get; set; }

    public void Set(T? value_) 
    {
    }
}

T?分解为nullable value type,使parameter.Set(null);有效.

Csharp相关问答推荐

Serilog SQL服务器接收器使用UTC作为时间戳

Blazor EventCallback<;MyType<;T>;>;

Thad.Sept()vs Task.Delay().Wait()

获取具有AutoFaces的所有IOptions对象的集合

正确处理嵌套的本机集合

.NET 8 DI GetServices<;对象&>不工作

如果是,我怎么才能让这个加75,如果不是,我怎么才能减go 100?

RX操作员使用先前值进行扫描,信号来自值本身

Content WithTargetPath实际上是有效的MSBuild项吗?

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

如何在使用属性 Select 器时判断是否可以为空

如何使用EPPlus C#在单个单元格中可视化显示多行文字

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

如何从SignalR获取连接客户端的域

如何使用.NET 8.0中新的CompositeFormat类?

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

无法通过服务控制台启动.NET Core 6.0服务(错误1053)

PowerShell:如何[引用]数组中的元素?

OPC UA标签收集(OPCFoundation NETStandard库,代码更正)

在Word Open OpenXML c#上应用葡萄牙语字符Times New Roman时出错