C# IEnumerable的扩展方法<;T>;它返回的类型为-this-

C# IEnumerable的扩展方法<;T>;它返回的类型为-this-,c#,ienumerable,C#,Ienumerable,就像我看到的,大多数IEnumerable扩展都会吃IEnumerable,然后呕吐。是否可以创建一个扩展方法,它可以吃掉任何IEnumerable(比如List),然后返回相同的类型-List 例如,我想迭代集合,如果出现问题,我将抛出异常,但如果一切正常,我需要返回相同的实例(相同类型)。我不认为这样做有什么好处,但您可以像这样解决问题的泛型部分: public static TEnumerable MyExtensionMethod<T, TEnumerable>(this T

就像我看到的,大多数IEnumerable扩展都会吃IEnumerable,然后呕吐。是否可以创建一个扩展方法,它可以吃掉任何IEnumerable(比如List),然后返回相同的类型-List


例如,我想迭代集合,如果出现问题,我将抛出异常,但如果一切正常,我需要返回相同的实例(相同类型)。

我不认为这样做有什么好处,但您可以像这样解决问题的泛型部分:

public static TEnumerable MyExtensionMethod<T, TEnumerable>(this TEnumerable enumerable)
    where TEnumerable : IEnumerable<T>
{
    ...
}

您需要使用两个通用参数:

public static TEnumerable Foo<TEnumerable, TItem>(this TEnumerable sequence)
    where TEnumerable: IEnumerable<TItem>
{
    return sequence;
}
公共静态可数Foo(此可数序列)
其中TEnumerable:IEnumerable
{
返回序列;
}

请注意,由于此更改,您将无法在调用此方法时推断泛型参数;您必须显式地指定它们。

根据他的问题,他总是会返回提供的参数。返回源序列允许链接此操作或其他序列操作,而不强制创建局部变量。因此,要调用它,我必须使用list。MyExtensionMethod@zgnilec对正如我在回答中所说的那样。也就是说,除非您还提供了类型为
T
的参数,或者使用
T
作为泛型参数。@Servy Yes我当然明白这是有意的。我的观点是,这似乎不是一件适合连锁的事情。“例如,我想迭代集合,如果出现问题,我将抛出异常,但如果一切正常,我需要返回相同的实例(相同类型)。”
选择
其中
,等等。已经这样做了-如果枚举的集合有问题,他们将抛出异常。那么,为什么要使用额外的扩展方法,除非它是独立完成的(而不是在一系列调用中)?请注意,您的建议意味着使用
IEnumerable
,因此您失去了按需(惰性)迭代和副作用。
public static TEnumerable Foo<TEnumerable, TItem>(this TEnumerable sequence)
    where TEnumerable: IEnumerable<TItem>
{
    return sequence;
}