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)