c# - 为什么类型推断在这种情况下不起作用?
问题描述
假设我有一个 POCO 和一个 List 类:
class MyClass
{...}
class MyClasses : List<MyClass>
{...}
IEnumerable<MyClass>
以及将 an 映射到列表的以下方法MyClasses
:
public static TListType ToListOfType<TListType, TItemType>(this IEnumerable<TItemType> list) where TListType : IList<TItemType>, new()
{
var ret = new TListType();
foreach (var item in list)
{
ret.Add(item);
}
return ret;
}
我希望这段代码能够编译,但它不会:
var list = someListOfMyClass.ToListOfType<MyClasses>();
但相反我得到
错误 CS1061“IEnumerable”不包含“ToListOfType”的定义,并且找不到接受“IEnumerable”类型的第一个参数的可访问扩展方法“ToListOfType”(您是否缺少 using 指令或程序集引用?)
但是,这确实有效:
var list = someListOfMyClass.ToListOfType<MyClasses, MyClass>();
我不明白为什么类型推断不足以让编译器知道项目类型是什么,因为this
变量是已知类型的列表。
解决方案
类型推断不会从泛型方法调用中推断出缺少的参数。相反,它要么推断所有论点,要么不推断任何论点。因此,您不能使用一种类型参数调用该方法并期望编译器提供其余的。
在这种情况下,可以推断TItemType
,因为它在参数之一中。TListType
但无法推断,因为它是返回类型。所以最终无法推断方法签名,您必须指定所有类型参数。
推荐阅读
- ag-grid-angular - 在 Angular 中使用 ag-grid 设置行索引
- python - 分散问题:ValueError:'c' 参数有 2 个元素,与大小为 70120 的 'x' 和 'y' 不一致
- docker - 在 Docker 上构建 mssql-server-windows-express 时出错
- java - 使用 Postgres 捕获 Hazelcast 变更数据
- python - 统一模拟与模拟对象的任何交互?
- php - 如何在 Laravel 作业中访问 Illuminate\\Notifications\\SendQueuedNotifications 类中的数据
- kotlin - 构建数据库表和@Relation 以从数据库实体创建问卷?(科特林,房间)
- php - 为什么 'ini_get_all()' 与 'php -i' 和 'php.ini' 有区别
- c# - 在 c# 中从 Cypher Result 反序列化为嵌套对象
- python - 如果没有找到 html 元素,让 Python 继续