C# 等待'上的过时属性;s类型的GetAwaiter方法是一个突破性的变化

C# 等待'上的过时属性;s类型的GetAwaiter方法是一个突破性的变化,c#,visual-studio-2012,visual-studio-2015,async-await,c#-5.0,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; 我在他们身上

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

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)]
因此,无论何时从代码中调用任何成员而不是使用wait,都会导致生成错误。在这个场景中使用过时属性并不是它的目的——但我不知道有什么更好的方法(如果有更好的解决方案的话,我很想听到),但它与Visual Studio 2012中包含的C#编译器配合得很好

我在Visual Studio 2015中原封不动地打开了解决方案,C#编译器似乎变得更挑剔了,因为它抱怨GetAwaiter方法的过时,并在
await obj
语句下面显示了扭曲


消除错误很容易,但是我很想知道为什么编译器现在似乎以常规方式访问GetAwaiter方法,而不是像在VisualStudio2012中那样(可能是过度反射?)。我的理解是,类型是否可等待是基于模式匹配的问题(所需的四个成员是否存在),而不是基于接口实现的问题。

我对您的问题没有直接的答案,但一种方法是编写一个分析程序来处理该问题。错误是以前的行为。如果你把某个东西标记为过时,那就意味着它不应该被使用,不管谁叫它。您以前的代码依赖于一个bug,肯定会在某个时候中断。还有其他一些情况下,编译器现在的行为更加理智