c# - 具有可转换参数的通用函数

标签 c# .net oop

我想编写一个通用函数,它接收一个列表作为参数。如果列表为 null,则应返回 null。 如果列表包含有效项目,则应返回第一项。 该函数应该适用于所有原始数据类型,如 int、short、float、double 等...

在我的示例中,我使用 int:

var a = new List<int>();
a.Add(3);

Foo<int, int?>(a);
Foo<int, int?>(null);

private T Foo<G, T>(List<G> list)
{
    if(list != null && list.Count > 0)
    {
        return list[0];
    }
    else
    {
        return default(T);
    }
}

不幸的是这不起作用,因为我没有找到一个泛型约束,证明编译器,那个int?可以转换为int和short吗?短路等... 我只想使用原始数据类型及其可为空的挂件以及字符串来调用该函数。

关于其他解决方案有什么想法吗? :-)

编辑:

它也应该适用于字符串。否则,Rene Vogts 的解决方案就可以工作。

最佳答案

只需更改方法的返回类型,您只需要一个泛型参数,限制为(不可为空)值类型:

private T? Foo<T>(List<T> list) where T : struct
{
    return list?.Count > 0 ? (T?)list[0] : null;
}

我认为不可能创建一个可以处理像string这样的引用类型的方法。但对于引用类型,您始终可以使用 LINQ 的 FirstOrDefault() 和 null 条件运算符:

List<string> list...
var result = list?.FirstOrDefault();

关于c# - 具有可转换参数的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48687220/

相关文章:

javascript - JavaScript 中的原型(prototype)与函数式 OOP

C#检测所有窗口中的按键事件

c# - 如何按日、周、月自动发送邮件?

c# - Visual C# .net 2013 和线程操作指南

php - 在对象中使用对象?

java - 不同的子类值能否体现在继承的方法中?

c# - 数组到字典

c# - 如何在 .NET 中实现夜间进程?

c# - CoInitialize() 是否总是在每个 .Net Framework/.Net Core 线程上隐式调用?

c# - 使用比我需要调用的方法更少受约束的泛型类型实现接口(interface)