title: Can I await something if there's no GetAwaiter method?
body: <p>I saw some articles about designing a custom awaitable type:</p>
  
  <p><a href="http://books.google.com.br/books?id=1On1glEbTfIC&amp;pg=PA83&amp;lpg=PA83&amp;dq=create+a+custom+awaitable+type" rel="noreferrer">http://books.google.com.br/books?id=1On1glEbTfIC&amp;pg=PA83&amp;lpg=PA83&amp;dq=create+a+custom+awaitable+type</a></p>
  
  <p>Now consider the example below:</p>
  
  <pre><code>&lt;Button x:Name="BtnA"
          Width="75"
          Margin="171,128,0,0"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          Click="BtnA_Click"
          Content="Button A" /&gt;
  &lt;Button x:Name="BtnB"
          Width="75"
          Margin="273,128,0,0"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          Content="Button B"  Click="BtnB_OnClick" /&gt;
  </code></pre>
  
  <p>and:</p>
  
  <pre><code>private async void BtnA_Click(object sender, RoutedEventArgs e)
  {
      MessageBox.Show("Awaiting Button B..");
  
      var sx = Observable.FromEvent&lt;MouseButtonEventHandler, 
                                    MouseButtonEventArgs&gt;(a =&gt; (b, c) =&gt; a(c),
                                    add =&gt; BtnB.PreviewMouseDown += add,
                                    rem =&gt; BtnB.PreviewMouseDown -= rem)
         .Do(a =&gt; a.Handled = true)
         .Take(1);
  
      await sx;
  
      MessageBox.Show("Button B Pressed after Button A");
  }
  
  private void BtnB_OnClick(object sender, RoutedEventArgs e)
  {
      MessageBox.Show("Button B Pressed Without Click in Button A");
  }
  </code></pre>
  
  <p>Why can I <code>await IObservable&lt;T&gt;</code> (in this case when subscription is completed), if there's no <code>GetAwaiter()</code> method?</p>
  
  <p>Is it implemented by the compiler? Is it possible to implement something that can <code>await</code> without to explicit this method (some scenarios which interfaces is being used)?
  And why isn't there something like:</p>
  
  <pre><code>public interface ITask&lt;out T&gt;
  {
      IAwaiter&lt;T&gt; GetAwaiter();
  }
  
  public interface IAwaiter&lt;out T&gt; : ICriticalNotifyCompletion
  {
      bool IsCompleted { get; }
      T GetResult();
  }
  </code></pre>
  
  <p>... or real interfaces to create a custom awaitable?</p>