27

我正在搞乱泛型和 IEnumerable,但我有点卡住了。这就是我想要做的事情:我想要一个返回任何集合类型的方法 - 实现 IEnumerable (?) - (例如:列表、堆栈、队列......)

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

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

这是我到目前为止所尝试的。但是这不起作用,我收到此错误:

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

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

将不胜感激任何建议或想法:)

4

6 回答 6

34

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

public IEnumerable<T> ReturnSomething<T>() 
{
    Stack<T> stackOfT = new Stack<T>();
    return stackOfT;
}

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

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

IEnumerable<int> myInts = ReturnSomething<int>();
于 2012-07-11T21:02:52.187 回答
11

诀窍是声明 <T>正确,如果你定义了 generic <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();
    }
}
于 2012-07-11T21:06:31.833 回答
3
public IEnumerable<T> returnSomething() 
{
    Stack<int> stackOfInts = new Stack<int>();
    return (IEnumerable<T>) stackOfInts;
}
于 2012-07-11T21:06:45.087 回答
2

类型参数需要由调用者在某处指定。

在实例化泛型类时:

public class MyClass<T>
{
    public IEnumerable<T> returnSomething()
    {
        Stack<T> stackOfTs = new Stack<T>();
        List<T> listOfTs = new List<T>();
        return stackOfTs;
    }
}

var v = new MyClass<int>();
foreach(var item in v.returnSomething())
{
}

或者在调用非泛型类的泛型方法时:

public class MyClass
{
    public IEnumerable<T> returnSomething<T>()
    {
        Stack<T> stackOfTs = new Stack<T>();
        List<T> listOfTs = new List<T>();
        return stackOfTs;
    } 
}


var v = new MyClass();
foreach(var item in v.returnSomething<int>())
{
}
于 2012-07-11T21:07:21.217 回答
2

如需更多帮助,完整结构如下...

我的模型是

  public class Student
{
    public int studentId { get; set; }
    public string studentName { get; set; }
    public string subject { get; set; }
    public string studentClass { get; set; }
    public int RollNumber { get; set; }

}

IEnumerable 返回数据列表

 public static IEnumerable<Student> ReturnSomething()
        {
            IList<Student> studentList = new List<Student>()
            {
                new Student()
                    {studentId = 1, studentName = "Bill", subject = "Science", studentClass = "nine", RollNumber = 01},
                new Student()
                    {studentId = 2, studentName = "Steve", subject = "Arts", studentClass = "ten", RollNumber = 03},
                new Student()
                    {studentId = 3, studentName = "Ram", subject = "Commerce", studentClass = "nine", RollNumber = 05},
                new Student()
                    {studentId = 1, studentName = "Moin", subject = "Science", studentClass = "ten", RollNumber = 06}
            };

            return studentList;
        }

最后一个是访问代码

 Student student = new Student();
 IEnumerable<Student> studentList = ReturnSomething();

        foreach (Student VARIABLE in studentList)
        {
            student.studentName += VARIABLE.studentName + " "+ "Class= ";
            student.studentClass += VARIABLE.studentClass + " ";
        }

        Console.WriteLine(student.studentName + student.studentClass);
        Console.ReadKey();
于 2019-11-24T03:34:24.500 回答
0

是的,如果您更改 I,您可以返回任何类型Enumerable<T> to IEnumerable<dynamic>

像这样:

public IEnumerable<dynamic> returnSomething() 
{
.....
于 2012-07-11T21:06:39.693 回答