有没有一种方法可以导致传递给Control.BeginInvoke的委托的类型推断?

注册表编辑

Control.BeginInvoke

在此处输入图片说明

在此处输入图片说明

在这两种情况下,显然编译器拥有推断委托类型所需的所有信息。但是在两种情况下,类型推断似乎都不起作用:

 BeginInvoke(myMethodThatTakesNoParams);

产生编译器错误

错误105最佳重载方法匹配为'System.Windows.Forms.Control.BeginInvoke(System.Delegate)'有一些无效的参数

一样

BeginInvoke(ShowProcessErrors, new object[] { process });

这两种方法仅在我更改它们以直接创建一个委托并将其传递时才进行编译。以下两个都可以正常编译:

BeginInvoke(new MethodInvoker(myMethodThatTakesNoParams));

BeginInvoke(new ProcessErrorDelegate(ShowProcessErrors), new object[] { process });

似乎没有任何明显的原因使类型推断在这里不起作用。是否可以在BeginInvoke不显式创建委托的情况下进行呼叫

迈克·兹伯雷

问题是,myMethodThatTakesNoParams它实际上不是委托,而是编译器的所谓“方法组”。方法组在CLR中不是真实类型。必须将其转换为要使用的委托类型。当使用这样的方法组时:

Action a = myMethodThatTakesNoParams;

编译器识别出您要将方法组转换为委托,并为您插入转换。它产生的IL有效地表示:

Action a = new Action(myMethodThatTakesNoParams);

当你说:

Delegate d = myMethodThatTakesNoParams

编译器并不真正知道该怎么做。从理论上讲,它可以为您选择任何兼容的委托类型,但是C#通常不会将您未使用的类型插入表达式中。由于它不知道您要将方法组转换为什么委托,因此编译器会产生错误。

我在示例中使用了变量赋值,但是相同的逻辑适用于方法的参数。

解决方法是编写自己的扩展方法,其中具有特定的委托类型:

static class ControlExtensions
{
    public static IAsyncResult BeginInvoke(this Control c, Action a)
    {
        return c.BeginInvoke(a);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以从作为泛型传递的接口中推断特定值的类型?

来自分类Dev

有没有一种方法可以检查委托是值还是引用类型?

来自分类Dev

有没有一种方法可以将stdin传递给VS Code,并告诉它将哪种文件类型视为?

来自分类Dev

Haskell:有没有一种方法可以从函数内部推断出函数的返回类型?

来自分类Dev

有没有一种方法可以推断出C ++中数组的单个元素的类型

来自分类Dev

有没有一种方法可以推断出C ++中数组的单个元素的类型

来自分类Dev

有没有一种方法可以为模板函数声明类型名?

来自分类Dev

有没有一种方法可以获取Func <T,bool>的类型?

来自分类Dev

有没有一种方法可以在Haskell中模拟线性类型?

来自分类Dev

有没有一种方法可以转换类型参数?

来自分类Dev

有没有一种方法可以使函数返回类型名?

来自分类Dev

有没有一种方法可以组合多个类型进行打字

来自分类Dev

有没有一种方法可以在Lotusscript中设置字段类型

来自分类Dev

有没有一种方法可以在C ++中使用类型文字?

来自分类Dev

有没有一种方法可以自动类型转换void指针?

来自分类Dev

有没有一种方法可以使构造函数接受两种可能的参数类型?

来自分类Dev

有没有一种方法可以从TypeScript中的泛型类型推断出泛型类型?

来自分类Dev

有没有一种方法可以访问某个类中某个类型的所有变量?

来自分类Dev

有没有一种方法可以用一个类型声明多个函数参数?

来自分类Dev

有没有一种方法可以将Java Collections与扩展的类类型一起使用?

来自分类Dev

有没有一种方法可以动态实例化一个类类型

来自分类Dev

有没有一种方法可以在TypeScript中创建扩展基本类型的名义类型?

来自分类Dev

有没有一种方法可以为UUID类型配置默认类型映射

来自分类Dev

有没有一种方法可以将Map <K,V>类型转换为Object类型?

来自分类Dev

有没有一种方法可以使用对象的类型作为类型参数的参数?

来自分类Dev

有没有一种方法可以使用Postgis Geometry类型将Spark连接到表?

来自分类Dev

有没有一种方法可以在Ruby中执行编译时类型检查?

来自分类Dev

有没有一种方法可以在Sparx Enterprise Architect中搜索元素类型?

来自分类Dev

有没有一种方法可以使用System.Linq.Dynamic查询类型

Related 相关文章

  1. 1

    有没有一种方法可以从作为泛型传递的接口中推断特定值的类型?

  2. 2

    有没有一种方法可以检查委托是值还是引用类型?

  3. 3

    有没有一种方法可以将stdin传递给VS Code,并告诉它将哪种文件类型视为?

  4. 4

    Haskell:有没有一种方法可以从函数内部推断出函数的返回类型?

  5. 5

    有没有一种方法可以推断出C ++中数组的单个元素的类型

  6. 6

    有没有一种方法可以推断出C ++中数组的单个元素的类型

  7. 7

    有没有一种方法可以为模板函数声明类型名?

  8. 8

    有没有一种方法可以获取Func <T,bool>的类型?

  9. 9

    有没有一种方法可以在Haskell中模拟线性类型?

  10. 10

    有没有一种方法可以转换类型参数?

  11. 11

    有没有一种方法可以使函数返回类型名?

  12. 12

    有没有一种方法可以组合多个类型进行打字

  13. 13

    有没有一种方法可以在Lotusscript中设置字段类型

  14. 14

    有没有一种方法可以在C ++中使用类型文字?

  15. 15

    有没有一种方法可以自动类型转换void指针?

  16. 16

    有没有一种方法可以使构造函数接受两种可能的参数类型?

  17. 17

    有没有一种方法可以从TypeScript中的泛型类型推断出泛型类型?

  18. 18

    有没有一种方法可以访问某个类中某个类型的所有变量?

  19. 19

    有没有一种方法可以用一个类型声明多个函数参数?

  20. 20

    有没有一种方法可以将Java Collections与扩展的类类型一起使用?

  21. 21

    有没有一种方法可以动态实例化一个类类型

  22. 22

    有没有一种方法可以在TypeScript中创建扩展基本类型的名义类型?

  23. 23

    有没有一种方法可以为UUID类型配置默认类型映射

  24. 24

    有没有一种方法可以将Map <K,V>类型转换为Object类型?

  25. 25

    有没有一种方法可以使用对象的类型作为类型参数的参数?

  26. 26

    有没有一种方法可以使用Postgis Geometry类型将Spark连接到表?

  27. 27

    有没有一种方法可以在Ruby中执行编译时类型检查?

  28. 28

    有没有一种方法可以在Sparx Enterprise Architect中搜索元素类型?

  29. 29

    有没有一种方法可以使用System.Linq.Dynamic查询类型

热门标签

归档