Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有可转换参数的泛型函数_C#_.net_Oop - Fatal编程技术网

C# 具有可转换参数的泛型函数

C# 具有可转换参数的泛型函数,c#,.net,oop,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&g

我想写一个通用函数,它接收一个列表作为参数。如果列表为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);
    }
}
var a=新列表();
a、 增加(3);
傅(甲),;
Foo(空);
私人T-Foo(名单)
{
if(list!=null&&list.Count>0)
{
返回列表[0];
}
其他的
{
返回默认值(T);
}
}
不幸的是,这不起作用,因为我没有找到一个通用约束,它可以证明编译器,int?可以转换为int和short吗?缩短等。。。 我只想使用基本数据类型及其可为空的悬垂项和字符串调用该函数

还有其他解决方案吗?:-)

编辑:


它还应该与字符串一起工作。否则,Rene Vogts的解决方案将起作用

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

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

可能
list?.FirstOrDefault()
?@GiladGreen不起作用,因为默认的
int
0
,而不是
null
。列表是不可为空的类型。这几乎就是我想要的。但我忘了提到,它也应该与字符串(不是原语的东西)一起工作。我更新了我的问题。@DavidElsner我认为这在一个泛型函数中是不可能的。最简单的选择是为
string
s创建一个单独的函数,即
私有字符串Foo(列表)
@stephenknedy是正确的。目前,在这种情况下,不可能交替处理引用类型和值类型的可空值。C#7.3正在更新一些通用约束,C#8可能会引入不可为空的引用类型,因此可能在某个时候会对这种情况进行改革。谢谢:)这个解决方案对我来说似乎很好
List<string> list...
var result = list?.FirstOrDefault();