gpt4 book ai didi

c# - 为什么不接受 IEnumerable(of T) 作为扩展方法接收器

转载 作者:可可西里 更新时间:2023-11-01 07:56:52 24 4
gpt4 key购买 nike

在代码前完成问题:

为什么是IEnumerable<T> where T : ITest不被接受为期望 this IEnumerable<ITest> 的扩展方法的接收者?

现在是代码:

我有三种类型:

public interface ITest { }
public class Element : ITest { }
public class ElementInfo : ITest { }

还有两种扩展方法:

public static class Extensions
{
public static IEnumerable<ElementInfo> Method<T>(
this IEnumerable<T> collection)
where T : ITest
{
→ return collection.ToInfoObjects();
}

public static IEnumerable<ElementInfo> ToInfoObjects(
this IEnumerable<ITest> collection)
{
return collection.Select(item => new ElementInfo());
}
}

我得到的编译器错误(在标记的行上):

CS1929 : 'IEnumerable<T>' does not contain a definition for 'ToInfoObjects' and the best extension method overload 'Extensions.ToInfoObjects(IEnumerable<ITest>)' requires a receiver of type 'IEnumerable<ITest>'

为什么会这样? ToInfoObjects 的接收者扩展方法是一个 IEnumerable<T>并通过通用类型约束,T必须实现 ITest .

为什么接收者不被接受?我的猜测是 IEnumerable<T> 的协方差但我不确定。

如果我改变 ToInfoObjects接收IEnumerable<T> where T : ITest , 那么一切就OK了。

最佳答案

考虑一下:

public struct ValueElement : ITest { }

还有这个:

IEnumerable<ValueElement> collection = ...
collection.Method(); //OK, ValueElement implement ITest, as required.
collection.ToInfoObjects() //Error, IEnumerable<ValueElement> is not IEnumerable<ITest>
//variance does not work with value types.

因此,并非 Method 允许的所有类型也允许 ToInfoObjects。如果您在 Method 中将 class 约束添加到 T,那么您的代码将通过编译。

关于c# - 为什么不接受 IEnumerable(of T) 作为扩展方法接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35081194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com