Kor*_*tak 15 .net c# generics extension-methods type-inference
代码前的完整问题:
为什么IEnumerable<T> where T : ITest不接受期望的扩展方法的接收者this IEnumerable<ITest>?
现在代码:
我有三种类型:
public interface ITest { }
public class Element : ITest { }
public class ElementInfo : ITest { }
Run Code Online (Sandbox Code Playgroud)
还有两种扩展方法:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的编译器错误(在标记的行上):
CS1929:'IEnumerable<T>'不包含定义,'ToInfoObjects'并且最好的扩展方法重载'Extensions.ToInfoObjects(IEnumerable<ITest>)'需要接收器类型'IEnumerable<ITest>'
为什么会这样?ToInfoObjects扩展方法的接收者是一个IEnumerable<T>并且通过泛型类型约束,T必须实现ITest.
为什么接收器不被接受?我的猜测是协方差,IEnumerable<T>但我不确定.
如果我改变ToInfoObjects接收IEnumerable<T> where T : ITest,那么一切都好.
use*_*407 14
考虑一下:
public struct ValueElement : ITest { }
Run Code Online (Sandbox Code Playgroud)
还有这个:
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.
Run Code Online (Sandbox Code Playgroud)
所以,不是每一种允许Method也允许ToInfoObjects.如果class向Tin 添加约束Method,那么代码将编译.
| 归档时间: |
|
| 查看次数: |
9416 次 |
| 最近记录: |