C# 用IEnumerable重载params函数
假设我有两个函数:C# 用IEnumerable重载params函数,c#,generics,params,C#,Generics,Params,假设我有两个函数: Foo(params INotifyPropertyChanged[] items) { //do stuff } Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged { Foo(items.ToArray()); } Foo(参数INotifyPropertyChanged[]项) { //做事 } Foo(IEnumerable items),其中T:INoti
Foo(params INotifyPropertyChanged[] items)
{
//do stuff
}
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
Foo(items.ToArray());
}
Foo(参数INotifyPropertyChanged[]项)
{
//做事
}
Foo(IEnumerable items),其中T:INotifyPropertyChanged
{
Foo(items.ToArray());
}
第二个允许我从一个具有约束的泛型类调用Foo
,其中T:INotifyPropertyChanged,但第二个解析为自身,因此我得到一个堆栈溢出异常
params
类型的可行选项,是否有其他方法从泛型类调用params
函数提前谢谢 您可以尝试转换输入
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}
Foo(IEnumerable项),其中T:INotifyPropertyChanged
{
Foo(items.Cast().ToArray());
}
如果这不起作用,我不知道,你可能运气不好。你需要通过一个
INotifyPropertyChanged[]
,而不是t[]
例如:
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
Foo(items.Cast<INotifyPropertyChanged>().ToArray());
}
您提供的代码选择Foo重载,这是堆栈溢出的保证。对不起,我错了。第一个函数似乎有Foo(params object[]items)签名。无法将类型“T[]”转换为“System.ComponentModel.INotifyPropertyChanged[]”并使用此答案,因为后一个选项消除了任何可能的歧义-第一个选项更像是编译器的诡计。
Foo(params INotifyPropertyChanged[] items)
{
Foo((IEnumerable<INotifyPropertyChanged>) items);
}
Foo<T>(IEnumerable<T> items) where T : INotifyPropertyChanged
{
//do stuff
}