相关疑难解决方法(0)

任务的协方差和逆变

鉴于以下片段,我完全不明白为什么即将实现的目标是不可能的:

接口:

public interface IEntityRepository<out T> : IRepository<IEntity> {

    void RequeryDataBase();

    IEnumerable<T> Search(string pattern);

    Task<IEnumerable<T>> SearchAsync(string pattern);

    SearchContext Context { get; }

    string BaseTableName { get; }
  }
Run Code Online (Sandbox Code Playgroud)

In IRepository<IEntity>只是简单的通用CRUD定义.

我在这一行得到错误: Task<IEnumerable<T>> SearchAsync(string pattern);

错误:

方法返回类型必须输出安全.无效方差:类型参数T必须在Task上无效

请帮我明白了,为什么我不能使用<out T>Task<T>

c# task covariance contravariance async-await

9
推荐指数
2
解决办法
2045
查看次数

如果没有GetAwaiter方法,我可以等待吗?

我看到一些关于设计自定义等待类型的文章:

http://books.google.com.br/books?id=1On1glEbTfIC&pg=PA83&lpg=PA83&dq=create+a+custom+awaitable+type

现在考虑以下示例:

<Button x:Name="BtnA"
        Width="75"
        Margin="171,128,0,0"
        HorizontalAlignment="Left"
        VerticalAlignment="Top"
        Click="BtnA_Click"
        Content="Button A" />
<Button x:Name="BtnB"
        Width="75"
        Margin="273,128,0,0"
        HorizontalAlignment="Left"
        VerticalAlignment="Top"
        Content="Button B"  Click="BtnB_OnClick" />
Run Code Online (Sandbox Code Playgroud)

和:

private async void BtnA_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Awaiting Button B..");

    var sx = Observable.FromEvent<MouseButtonEventHandler, 
                                  MouseButtonEventArgs>(a => (b, c) => a(c),
                                  add => BtnB.PreviewMouseDown += add,
                                  rem => BtnB.PreviewMouseDown -= rem)
       .Do(a => 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 …
Run Code Online (Sandbox Code Playgroud)

.net c# system.reactive async-await

7
推荐指数
1
解决办法
8250
查看次数