我不完全确定如何使这个问题可读/易于理解,但请听我说,我希望当我们结束时你能理解我的问题(至少,它很容易重现)。
我尝试在 UnitTests 中调用用于验证结果的方法。它具有以下签名:
void AssertPropertyValues<TEnumerable, TElement, TProperty>(
TEnumerable enumerable,
Func<TElement, TProperty> propertyPointer,
params TProperty[] expectedValues)
where TEnumerable : System.Collections.Generic.IList<TElement>
这意味着,它需要以下输入
- 任何可枚举的对象,并且包含与 2) 的输入类型相同的对象。
- 一个 Func(通常封装 lambda 表达式),它接受一个与 1) 的“内容”相同类型的对象,并返回一个与 3) 中提供的数组内容的类型相同类型的对象。
- 与 2) 中的 Func 的输出具有相同类型的对象数组。
因此,此方法的实际执行可能如下所示:
AssertPropertyValues(
item.ItemGroups,
itemGroup => itemGroup.Name,
"Name1", "Name2", "Name3");
至少,这就是我希望它看起来的样子,但我遇到了众所周知的编译器错误:“方法'X'的类型参数无法从用法中推断出来。”,这就是我不知道的理解。据我所知,它应该包含所需的所有信息,或者它可能是“协变和逆变”问题的另一个版本?
所以现在我被迫这样做:
AssertPropertyValues(
item.ItemGroups,
(ItemGroup itemGroup) => itemGroup.Name,
"Name1", "Name2", "Name3");
谁能指出为什么编译器无法推断出这种情况?