我想要一个返回任何集合类型的方法-实现
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;
}
这是我到目前为止尝试过的。然而这不起作用,我得到这个错误:
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
了。
我该如何解决这个问题?
你需要在你的方法中添加一个泛型参数:
public IEnumerable<T> ReturnSomething<T>()
{
Stack<T> stackOfT = new Stack<T>();
return stackOfT;
}
类型参数出现在方法名之后,参数之前。也可以有一个带有多个类型参数的方法。
调用方法时可以指定类型:
IEnumerable<int> myInts = ReturnSomething<int>();
诀窍是 declare
<T>
对,如果你定义泛型 <T>
,那么你必须在你的方法中坚持它,所以如果你有 IEnumerable<T>
然后在你的方法的其他地方你必须使用 <T>
而不是<int>
或任何其他类型。
只有当你实际use你的通用类型时,你才会用通用类型
<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();
}
}
public IEnumerable<T> returnSomething()
{
Stack<int> stackOfInts = new Stack<int>();
return (IEnumerable<T>) stackOfInts;
}
类型参数需要调用者在某处指定。
无论是在实例化泛型类时:
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>())
{
}
有关以下完整结构的更多帮助...
我的模特是
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; }
}
IE可数返回数据列表
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();
是的,如果你改变 I ,你可以返回任何类型
Enumerable<T> to IEnumerable<dynamic>
像这样:
public IEnumerable<dynamic> returnSomething()
{
.....