等待类型的过时属性GetAwaiter方法是一个重大变化

时间:2015-12-10 14:37:47

标签: c# visual-studio-2012 visual-studio-2015 async-await c#-5.0

我通过提供以下四个实例成员实现了我自己的等待类型:

public bool IsCompleted { get; }
public void OnCompleted(Action continuation); 
public AwaitResult GetResult(); 
public object GetAwaiter();

因为这是所有编译器都要求我接受

MyAwaitableType obj = new MyAwaitableType();
await obj;

我用

标记了所有这些标记
[Obsolete("Do not use in code.", true)]

因此,无论何时从代码调用任何成员而不是使用await,都会导致生成错误。在这种情况下使用Obsolete-Attribute不是它的预期方式 - 但我不知道更好的方法(如果有更好的解决方案,我很想听到更好的解决方案),但它在Visual中包含的C#编译器中运行良好Studio 2012。

我在Visual Studio 2015中打开了解决方案,似乎C#编译器有点挑剔,因为它抱怨GetAwaiter方法的过时并在await obj语句下面显示曲折。

摆脱错误很容易,但我很想知道为什么编译器现在以常规方式访问GetAwaiter方法,而不是在Visual Studio 2012中进行(可能是反射?)。我的理解是,类型是否可以等待是基于模式匹配(存在与否的四个必需成员)而不是基于接口实现的问题。

0 个答案:

没有答案