C# 在泛型类的泛型类上获取正确的约束

C# 在泛型类的泛型类上获取正确的约束,c#,generics,C#,Generics,在我的后端,我有一个定义了两种类型的接口: public class FilterRange { public double? Min { get; set; } public double? Max { get; set; } } public class FilterRange<T> where T : struct { public T? Min { get; set; } public T? Max { get; set; } } 也许

在我的后端,我有一个定义了两种类型的接口:

public class FilterRange
{
    public double? Min { get; set; }

    public double? Max { get; set; }
}

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

    public T? Max { get; set; }
}
也许行得通,但不行


“我的视图模型”的正确定义是什么?

您需要在类类型参数中同时定义
T
U

public class FilterRangeBaseViewModel<T, U> : ViewModelBase<T>, IDataErrorInfo
where T: FilterRange<U>, new() where U : struct
公共类FilterRangeBaseViewModel:ViewModelBase,IDataErrorInfo
其中T:filterge,new(),其中U:struct

根据注释进行编辑。

您是否希望使用预期原始数据类型的泛型类型(如int、双、短等)?在这种情况下,我会考虑重载而不是泛型,但这是您的选择,我只是想知道您的结果是什么?)@库斯克曼,您是对的。既然定义正确,我就看到了这种方法的问题。这是可行的,但事与愿违。是的,正是我的意思。你要介绍的这种类型最终会像原始数据类型一样受到威胁,但这在运行时并不容易,所以你必须进行一些显式的强制转换和检查,以及一些会污染你的代码的东西,在我看来,这些东西会破坏泛型的概念,因为在我看来泛型是关于代码可读性和可重用性的@kuskmen感谢你,我今天学到了一些非常有价值的东西:)请注意
new()
约束是多余的;你不需要它,结构保证有一个无参数的构造函数。如果它要用一个非泛型的
filterAge
镜像现有的基,那么
new()
应该在
t
上,而不是
U
@Damien\U不信者是的,就是这样。所以,如果我这样做,我必须失去
new()
约束?这是不好的,因为类中有一个方法返回一个新的T类(T是一个
FilterRange
)。有没有关于如何绕过这一限制的建议?我可以指定struct约束仅应用于U参数吗?可以,只需将
new()
约束移回
T
约束列表。
public class FilterRangeBaseViewModel<T> : ViewModelBase<T>, IDataErrorInfo
    where T: FilterRange<U> where U : struct, new()
public class FilterRangeBaseViewModel<T, U> : ViewModelBase<T>, IDataErrorInfo
where T: FilterRange<U>, new() where U : struct