出于好奇,我试图在 .NET 3.5 Client Profile 下编译一些简单的async
/代码:await
async void AwaitFoo()
{
await new Foo();
}
class Foo
{
public IFooAwaiter GetAwaiter() { … }
}
interface IFooAwaiter : System.Runtime.CompilerServices.INotifyCompletion
{
bool IsCompleted { get; }
void GetResult();
}
我完全清楚 .NET 3.5 不支持此语言功能,如以下编译错误所示:
找不到
async
修饰符所需的所有类型。您的目标是错误的框架版本,还是缺少对程序集的引用?
我也知道NuGet 包Microsoft.Bcl.Async
,它不支持 .NET 3.5。
问题:编译代码所需async
的最小类型和类型成员集是多少?这个最小集合是否正式记录?如果是这样,在哪里?(请注意,我只对成功编译感兴趣,而不是执行。)
到目前为止我得到了什么:
我一直在尝试通过实验找到这个最小的类型集,这似乎是可能的,因为编译器报告需要,但缺少一个一个类型:
System.Runtime.CompilerServices.IAsyncStateMachine
未定义或导入预定义类型。
根据 MSDN 参考页面定义报告的类型,然后会导致报告下一个缺少的类型。我到目前为止:
System.Runtime.CompilerServices.IAsyncStateMachine
System.Runtime.CompilerServices.INotifyCompletion
(上面的示例代码需要)System.Threading.Tasks.CancellationToken
(要求Task
)System.Threading.Tasks.TaskCreationOptions
(要求Task
)System.Threading.Tasks.Task
此时我停止了,因为Task
有很多成员,但编译器没有准确报告它需要哪些成员;它只是报告整个类型。因此,我可能会复制比实际需要更多的类型定义。