我正在研究.net框架,其中一种情况使我感到困惑。你能帮我调查一下吗?
因此,我了解了Tasks并注意到编译器可以解析此类代码
var tsk = new Task(Foo);
Foo在哪里
void Foo() {//smth}
但是
var tsk = Task.Run(Foo);
带下划线的红色,编译器说我不能使用void代替action,而是将其替换为:
var tsk = Task. Run(()=>Foo());
那很好。
这很奇怪,因为Task和static Run的构造函数具有相同的输入参数-Action委托。
所以我用dnSpy分解了我的代码,并且看到了以下内容:
Task tsk = new Task(new Action(MainClass.Rn));
Task.Run(delegate()
{
MainClass.Rn();
});
在这里,我有第一个问题: 在使用静态Run方法的情况下,为什么编译器无法将方法自动包装为动作委托?
第二个问题:
dnSpy提供给我的已解析代码与Roslyn或其他vs编译器所解析的代码是否相同,还是只是试图猜测可能会如何?