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