C# 具有可转换参数的泛型函数
我想写一个通用函数,它接收一个列表作为参数。如果列表为null,则应返回null。 如果列表包含有效项,则应返回第一项。 该函数应适用于所有基本数据类型,如int、short、float、double等 在我的示例中,我使用int: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
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();