返回一个通用的IEnumerable <T>

Tho*_*and 21 c# generics ienumerable

我正在搞乱泛型和IEnumerable abit,但我有点卡住了.这是我正在尝试做的事情:我希望有一个返回任何集合类型的方法 - 实现IEnumerable(?) - (例如:List,Stack,Queue,...)

此外,我希望能够返回任何数据类型的任何集合类型.所以我希望这种方法能够返回一个List<string>,以及一个Stack<int>,以及List<double>...等等.

 public IEnumerable<T> returnSomething() 
    {
        Stack<int> stackOfInts = new Stack<int>();
        List<string> listOfStrings = new List<string>();
        return stackOfInts;
    }
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所尝试的.这不起作用,我得到这个错误:

Cannot implicitly convert type 'System.Collections.Generic.Stack<int>' to 'System.Collections.Generic.IEnumerable<T>'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

但是,如果我将IEnumerable<T>方法签名替换为IEnumerable<int>,我可以返回int类型的任何集合.这意味着,现在我不能再回来ListOfStrings了.

会很感激任何建议或想法:)

Mar*_*ers 30

您需要在方法中添加泛型类型参数:

public IEnumerable<T> ReturnSomething<T>() 
{
    Stack<T> stackOfT = new Stack<T>();
    return stackOfT;
}
Run Code Online (Sandbox Code Playgroud)

类型参数出现在方法名称之后,但出现在参数之前.也可以使用具有多个类型参数的方法.

调用方法时,可以指定类型:

IEnumerable<int> myInts = ReturnSomething<int>();
Run Code Online (Sandbox Code Playgroud)


ole*_*sii 11

诀窍是声明 <T>正确,如果你定义泛型<T>,那么你必须在你的方法中坚持它,所以如果你IEnumerable<T>在方法的其他地方你必须使用<T>而不是<int>或任何其他类型.

只有当你实际使用泛型类型时,才能泛型替换<T>为真实类型.

查看样本

class Foo<T>
{
    public IEnumerable<T> GetList()
    {
        return new List<T>();
    }

    public IEnumerable<T> GetStack()
    {
        return new Stack<T>();
    }
}

class Program
{
    static void Main(string[] args)
    {
        Foo<int> foo = new Foo<int>();
        IEnumerable<int> list = foo.GetList();
        IEnumerable<int> stack = foo.GetStack();

        Foo<string> foo1 = new Foo<string>();
        IEnumerable<string> list1 = foo1.GetList();
        IEnumerable<string> stack1 = foo1.GetStack();
    }
}
Run Code Online (Sandbox Code Playgroud)