我正在尝试编写一个提供参数并调用函数的泛型方法,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
最后一行无法使用CS0411进行编译.是否有任何解决方法可以在这里使用类型推断?
使用案例:使用AutoFixture生成函数调用参数.
我正在使用Windows窗体应用程序,它包含自定义控件,其中的方法可能会从UI线程以外的线程调用.因此,这些方法看起来有点像这样以防止异常:
public void DoSomeStuff()
{
if (InvokeRequired)
{
Invoke((Action)DoSomeStuff);
}
else
{
// Actually do some stuff.
}
}
Run Code Online (Sandbox Code Playgroud)
方法组的显式转换DoSomeStuff到Action了我的注意,所以我一直在寻找到代表和其他相关学科更深入的比我以前.
虽然我在这里看到了一些相关的问题,但我还是找不到我的答案,这是:
为什么方法组在这种情况下DoSomeStuff需要显式转换Action?
如果我删除了演员,那么我会得到两个错误:
错误102参数1:无法从'方法组'转换为'System.Delegate'
错误101'System.Windows.Forms.Control.Invoke(System.Delegate,params object [])'的最佳重载方法匹配有一些无效的参数
编译器显然混淆了使用哪个重载Invoke似乎是一个相当大的提示,但我仍然不确定为什么它无法解决这个问题.我希望编译器推断出第Invoke一个带有单个Delegate参数的重载是应该使用的那个.
我希望如果代码是这样编写的话没有问题:
Action a = DoSomeStuff;
Invoke(a);
Run Code Online (Sandbox Code Playgroud)
方法组DoSomeStuff可以隐式转换为Action委托类型,并Action从中派生(技术上?)System.Delegate,因此Invoke可以a毫无困难地处理参数.但是当我尝试DoSomeStuff直接作为参数传递时,为什么编译器无法进行隐式转换?说实话,我不相信我自己的逻辑,但我仍然不确定我错过了什么.