C#方法组类型推断

14

我正在尝试编写一个通用的方法,该方法提供参数并调用函数,就像这样:

class MyClass {
    public int Method(float arg) => 0;
}

TResult Call<T1, TResult>(Func<T1, TResult> func) =>
    func(default(T1));

void Main()
{
    var m = new MyClass();
    var r1 = Call<float, int>(m.Method);
    var r2 = Call(m.Method); // CS0411
}

最后一行代码无法编译,会出现CS0411错误。这里是否有任何解决方法可以使类型推断正常工作?

用例:使用AutoFixture生成函数调用参数。


我认为这是不可能的。 - mrahhal
相关链接:https://dev59.com/kGDVa4cB1Zd3GeqPeYpD#9331879 - BJ Myers
在他的情况下,这两种类型是独立的,并且都由方法句柄给出,与此无关。理论上,C#可以完全推断出正确的泛型参数。标准之所以没有要求这样做,是因为复杂性原因。 - Blindy
如果您只打算通过调用来调用方法的类型默认值,则可以重载该方法。 - ManoDestra
1个回答

7

很遗憾,这是 C# 类型推断的一个限制。它对返回类型并没有做太多处理,而在你的情况下需要完全推断出泛型参数以调用 Call<>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接