有此扩展程序
public static bool In<T>(this T t, params T[] values)
{
return values.Contains(t);
}
希望它接受IEnumerable并在扩展中扩展时转换为数组,但我不知道如何使用params关键字。
尝试:
public static bool In<T>(this T t, params IEnumerable<T> values)
{
return values.Contains(t);
}
但这会产生编译时错误:参数数组必须是单维数组
有没有办法让扩展方法支持IEnumerable参数?如果没有,为什么不呢?
答案 0 :(得分:5)
不,这是不可能的,因为错误消息非常直截了当地告诉你。
这是不可能的,因为规格说这是不可能的。微软选择不实施提议的功能,大概是因为他们从未认为其好处大于其成本。
您可以管理的最佳解决方法是创建两个重载,一个使用params
,一个接受IEnumerable<T>
,并且一个调用另一个(或者,因为您的方法非常简单,只需实施两者):
public static bool In<T>(this T t, params T[] values)
{
return In<T>(t, values.AsEnumerable());
}
public static bool In<T>(this T t, IEnumerable<T> values)
{
return values.Contains(t);
}
答案 1 :(得分:0)
params IEnumerable
。它是Visual Studio UserVoice上所请求的功能之一:Allow using params IEnumerable。你可以投票。
此功能为planned for C# 6。实现时,“参数数组必须是单维数组”错误消息将消失。
在此之前,您必须支持两个方法重载:一个带有数组,一个带有IEnumerable
。请参阅@ Servy的回答。