从delegate到Delegate要如何转型

从delegate到Delegate要怎么转型?
很多形如BeginInvoke的函数,其参数类型都是一个Delegate类型。
那么关键字delegate声明的函数,如何才能转型成Delegate类型呢?

我在网上看到一个例子:

textBox1.BeginInvoke((Action) delegate { textBox1.Text = "kkk"; });

我的理解是,这里用delegate关键字声明了一个匿名函数,用来设置textBox1.Text。
如果我去掉(Action),那么就会编译不过。可是Action类型本身就是一个委托啊,这个从delegate到Action的转型为何是必需的,去掉(Action),编译器不会把delegate变成一个Delegate? 印象中.net的Int32/int, String/string等类型和关键字之间的转换是自动完成的。但是Delegate/delegate之间不能自动转换?

请斧正!
------解决方案--------------------
MSDN关于Delegate类有如下描述:
Delegate 类是委托类型的基类。然而,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。此外,还不允许从委托类型派生新类型。Delegate 类不是委托类型,该类用于派生委托类型。
大多数语言实现 delegate 关键字,这些语言的编译器能够从 MulticastDelegate 类进行派生;所以,用户应当使用语言所提供的 delegate 关键字。
------解决方案--------------------
你可以换种写法:
textBox1.BeginInvoke(new Action(()=> textBox1.Text = "kkk"));

------解决方案--------------------
方法要求参数的是一个委托(delegate)类型, 而现在传递的只是一个匿名方法. 产生这个错误最根本的原因是编译器在处理匿名方法的时候, 没法推断出这个委托的方法返回的是什么类型, 也就不知道返回一个什么样的委托.
------解决方案--------------------
你可以把Int32/int, String/string看成是等价的,但是,delegate和Delegate差别就大了,一个是C# 的关键字,一个是抽象类
------解决方案--------------------
textBox1.BeginInvoke(()=> { textBox1.Text = "kkk"; });

这样直接应用Action委托,应该不会报错吧,没必要指定Action
------解决方案--------------------
引用:
Quote: 引用:

你可以换种写法:
textBox1.BeginInvoke(new Action(()=> textBox1.Text = "kkk"));


难道必须用一个Action来传递吗? Lambda/匿名函数都不行吗?


因为编译器在处理匿名方法的时候, 没法推断出这个委托的方法返回的是什么类型(委托也是一种类型),所以要指定返回类型。
------解决方案--------------------
至于int自动转int32,这个就正常了,int只是int32在C#里的别名,编译器很清楚这点。