C# 将泛型类型强制转换为其不可为null的形式

C# 将泛型类型强制转换为其不可为null的形式,c#,C#,我有以下方法 public ValidationOutput PerformMatch<T>(IEnumerable<T> values, decimal maximum) 我的问题是如何使用泛型类型进行转换?如果不能做到这一点,那么我唯一的选择是使用3个几乎重复代码的PerformMatch方法吗 编辑:我的主要问题是数学。Abs需要一个不可为空的类型。我很难将泛型类型强制转换为不可为null的类型首先,将可为null添加到类型的定义中: public Validat

我有以下方法

public ValidationOutput PerformMatch<T>(IEnumerable<T> values, decimal maximum)
我的问题是如何使用泛型类型进行转换?如果不能做到这一点,那么我唯一的选择是使用3个几乎重复代码的PerformMatch方法吗


编辑:我的主要问题是数学。Abs需要一个不可为空的类型。我很难将泛型类型强制转换为不可为null的类型

首先,将
可为null
添加到类型的定义中:

public ValidationOutput PerformMatch<T>(IEnumerable<Nullable<T>> values, decimal maximum)
试一试

公共验证输出性能匹配(IEnumerable值,十进制最大值)
其中T:struct

然后,您可以使用HasValue属性和GetValueOrDefault方法执行所需操作。

如果您只有三种类型,我建议不要在此处使用泛型:

public ValidationOutput PerformMatch(IEnumerable<Int32?> values, decimal maximum)
{
    return PerformMatch(values.Select(i => (decimal?)i), maximum);
}

public ValidationOutput PerformMatch(IEnumerable<Int64?> values, decimal maximum)
{
    return PerformMatch(values.Select(i => (decimal?)i), maximum);
}

public ValidationOutput PerformMatch(IEnumerable<decimal?> values, decimal maximum)
{
    // your logic here
}
公共验证输出性能匹配(IEnumerable值,十进制最大值)
{
返回PerformMatch(值。选择(i=>(十进制?)i),最大值);
}
公共验证输出性能匹配(IEnumerable值,十进制最大值)
{
返回PerformMatch(值。选择(i=>(十进制?)i),最大值);
}
公共验证输出性能匹配(IEnumerable值,十进制最大值)
{
//你的逻辑在这里
}

如果我理解正确,您希望列出值中不为空的所有项目

var list = values.Where(x=>x.HasValue).ToList();    

HasValue检查项是否有值且不为null。

为什么该方法必须是泛型的?为什么不能为您使用的每种数字类型使用单独的方法。请解释匿名类型的“不可为null的形式”是什么。@SriramSakthivel,因为该方法要大得多,而且会有大量代码duplication@k29:然后将公共代码提取到私人助手方法中。您的术语已关闭。T不是匿名类型;它是泛型类型参数。如果您还不熟悉“泛型类型约束”的概念,请仔细阅读。只要我在方法末尾添加
where T:struct
(如Phoog的回答中所示),将值转换为列表,就可以了。Convert.ToDecimal在铸造方面很有用,因此我可以使用Math.Abs
public ValidationOutput PerformMatch<T>(IEnumerable<T?> values, decimal maximum)
where T : struct
public ValidationOutput PerformMatch(IEnumerable<Int32?> values, decimal maximum)
{
    return PerformMatch(values.Select(i => (decimal?)i), maximum);
}

public ValidationOutput PerformMatch(IEnumerable<Int64?> values, decimal maximum)
{
    return PerformMatch(values.Select(i => (decimal?)i), maximum);
}

public ValidationOutput PerformMatch(IEnumerable<decimal?> values, decimal maximum)
{
    // your logic here
}
var list = values.Where(x=>x.HasValue).ToList();