C#如何使扩展接受IEnumerable而不是params数组

时间:2014-03-04 17:44:13

标签: c#

有此扩展程序

    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参数?如果没有,为什么不呢?

2 个答案:

答案 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)

当前版本的C#不支持

params IEnumerable。它是Visual Studio UserVoice上所请求的功能之一:Allow using params IEnumerable。你可以投票。

此功能为planned for C# 6。实现时,“参数数组必须是单维数组”错误消息将消失。

在此之前,您必须支持两个方法重载:一个带有数组,一个带有IEnumerable。请参阅@ Servy的回答。