我不确定如何让这个问题更易读/易懂,但请听我说,希望在我们到达结尾时您能理解我的问题(至少,它很容易重现)。
我试图调用一个用于验证单元测试结果的方法。它具有以下签名:
void AssertPropertyValues<TEnumerable, TElement, TProperty>(
TEnumerable enumerable,
Func<TElement, TProperty> propertyPointer,
params TProperty[] expectedValues)
where TEnumerable : System.Collections.Generic.IList<TElement>
这意味着该方法接受以下输入:
1. 任何可枚举的对象,其中包含与第二点输入相同类型的对象。 2. 一个 Func(通常封装 lambda 表达式),它接受与第 1 点“内容”类型相同的对象,并返回与第三点提供的数组内容类型相同的对象。 3. 一个由与第 2 点输出类型相同的对象组成的数组。
因此,该方法的实际执行可能如下所示:
AssertPropertyValues(
item.ItemGroups,
itemGroup => itemGroup.Name,
"Name1", "Name2", "Name3");
至少,这就是我希望它看起来的样子,但是我遇到了众所周知的编译器错误:“无法从使用中推断方法'X'的类型参数。”,而这正是我不理解的。在我看来,它应该有所有必要的信息,或者是“协变性和逆变性”问题的另一个版本吗?
因此,现在我被迫改用这种方式:
AssertPropertyValues(
item.ItemGroups,
(ItemGroup itemGroup) => itemGroup.Name,
"Name1", "Name2", "Name3");
有人可以指出为什么编译器无法推断出这种情况吗?
IEnumerable<TElement>
或类似的东西来代替TEnumerable
吗?基本上,propertyPointer
参数应该与谓词(例如在Enumerable.Select
扩展方法中)相同,因此整个结构工作方式相同...item.ItemGroups
是哪种类型(是否有任何不匹配,使得显式签名成为必需?)?否则,我就无法理解你所面临的问题了... - user57508