相关疑难解决方法(0)

C#方法组类型推断

我正在尝试编写一个提供参数并调用函数的泛型方法,如下所示:

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生成函数调用参数.

c# generics type-inference

14
推荐指数
1
解决办法
510
查看次数

将方法组隐式转换为Delegate(对于Control.Invoke的参数)

我正在使用Windows窗体应用程序,它包含自定义控件,其中的方法可能会从UI线程以外的线程调用.因此,这些方法看起来有点像这样以防止异常:

public void DoSomeStuff()
{
    if (InvokeRequired)
    {
        Invoke((Action)DoSomeStuff);
    }
    else
    {
        // Actually do some stuff.
    }
}
Run Code Online (Sandbox Code Playgroud)

方法组的显式转换DoSomeStuffAction了我的注意,所以我一直在寻找到代表和其他相关学科更深入的比我以前.

虽然我在这里看到了一些相关的问题,但我还是找不到我的答案,这是:

为什么方法组在这种情况下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直接作为参数传递时,为什么编译器无法进行隐式转换?说实话,我不相信我自己的逻辑,但我仍然不确定我错过了什么.

c# delegates implicit-conversion

8
推荐指数
1
解决办法
4590
查看次数