具有可转换参数的通用函数

Dav*_*son 2 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有关其他解决方案的任何想 :-)

编辑:

它也应该与字符串一起使用.否则Rene Vogts解决方案将起作用.

Ren*_*ogt 5

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

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

我认为不可能制作一个也可以处理类似参考类型的方法string.但对于引用类型,您始终可以使用LINQ' FirstOrDefault()和空条件运算符:

List<string> list...
var result = list?.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

  • @DavidElsner我认为在一个通用函数中是不可能的.最简单的选择是为`string`s创建一个单独的函数,即`private string Foo(List <string> list)`. (2认同)