繁体   English   中英

为什么要执行新任务 <object> ((功能 <Task<object> &gt;)(异步()=&gt; {})在新任务时工作 <Foo> ( … ) 才不是?

[英]Why does New Task<object>( (Func<Task<object>>)( async ( ) => { } ) work when new Task<Foo>( … ) does not?

为什么当new Task<Foo>( ... )不起作用时, new Task<object>( (Func<Task<object>>)( async ( ) => { } )起作用?

这有效:

private static Task<object> Works( ) {
    return new Task<object>( ( Func<Task<object>> )( async ( ) => {
        return new object( );
    } ), new CancellationTokenSource( ).Token );
}

但这不是:

private static Task<Foo> Doesnt( ) {
    return new Task<Foo>( (Func<Task<Foo>>)(async ( ) =>{
        return new Foo( );
    } ), new CancellationTokenSource( ).Token );
}

Foo替换为不是对象的任何东西(或我猜到的任何其他原语),您将看到在红色的花键上得到相同的错误消息: The best overloaded method match for 'System.Threading.Task.Task<Foo>.Task(object, System.Threading.Tasks.TaskCreationOptions)' has some invalid arguments

我甚至看到了重载方法,它是指......,但为什么它认为我试图调用该方法,当我使用Func<Task<Foo>>不是当我用Func<Task<object>> ?????

这适用于对象(或对象),但对于我的类却失败。 我什至尝试了另一个类对象(Window),但失败了。

编辑

为了回应有关第一位不编译的说法,我已经能够编译以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncFlubbery {
    class Program {

        private static Task<object> Works( ) {
            return new Task<object>( ( Func<Task<object>> )( async ( ) => {
                return new object( );
            } ), new CancellationTokenSource( ).Token );
        }

        static void Main( string[ ] args ) {
            Works( ).Start( );
            Console.WriteLine( "Press Enter To Begin..." );
            Console.ReadLine( );
        }
    }
}

这是类型转换的简单情况。

归结为以下代码:

Func<Task<object>> fto = null;
Func<object> fo = fto; //this is a fine cast

Func<Task<Foo>> ftf = null;
Func<Foo> ff = ftf; //this is **NOT** a fine cast

由于Task<object>object派生的,因此第一个转换是正确的。

但是Task<Foo> 不是Foo派生的,因此强制类型转换无效。

因此,即使第一个代码编译了,它也不会在运行时按预期运行。 代码的两个位最终都是错误的。

为什么删除 async/await 会导致 Task 转换错误<t>到任务<object><div id="text_translate"><p>我有以下通用和非通用方法:</p><pre class="lang-cs prettyprint-override"> public async Task&lt;T&gt; LoadAsync(Guid id) { return await _someService.SomeMethodAsync(id); } async Task&lt;object&gt; LoadObjectAsync(Guid id) =&gt; await LoadAsync(id);</pre><p> 尝试遵循<a href="https://blog.stephencleary.com/2016/12/eliding-async-await.html" rel="nofollow noreferrer">Stephen Cleary 的建议</a>,我想我会通过从LoadObjectAsync方法中删除 async/await 来提高代码效率,因为它是一个传递。 但是,当我将签名更改为:</p><pre class="lang-cs prettyprint-override"> Task&lt;object&gt; LoadObjectAsync(Guid id) =&gt; LoadAsync(id);</pre><p> 我收到一条错误消息,提示我无法从Task&lt;T&gt;隐式转换为Task&lt;object&gt; 。 我想知道的是异步等待如何避免这个转换问题? 我知道通用方差禁止转换Task&lt;&gt;但为什么这不适用于 async/await 版本?</p></div></object></t>

[英]Why does removal of async/await cause conversion error for Task<T> to Task<object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 运行异步 lambda 时,使用 Task.Run(func) 或 new Func<Task> (功能)()? 为 Func 切换 new Task(()=&gt;{ })<task></task> 为什么删除 async/await 会导致 Task 转换错误<t>到任务<object><div id="text_translate"><p>我有以下通用和非通用方法:</p><pre class="lang-cs prettyprint-override"> public async Task&lt;T&gt; LoadAsync(Guid id) { return await _someService.SomeMethodAsync(id); } async Task&lt;object&gt; LoadObjectAsync(Guid id) =&gt; await LoadAsync(id);</pre><p> 尝试遵循<a href="https://blog.stephencleary.com/2016/12/eliding-async-await.html" rel="nofollow noreferrer">Stephen Cleary 的建议</a>,我想我会通过从LoadObjectAsync方法中删除 async/await 来提高代码效率,因为它是一个传递。 但是,当我将签名更改为:</p><pre class="lang-cs prettyprint-override"> Task&lt;object&gt; LoadObjectAsync(Guid id) =&gt; LoadAsync(id);</pre><p> 我收到一条错误消息,提示我无法从Task&lt;T&gt;隐式转换为Task&lt;object&gt; 。 我想知道的是异步等待如何避免这个转换问题? 我知道通用方差禁止转换Task&lt;&gt;但为什么这不适用于 async/await 版本?</p></div></object></t> 等待新任务<T> (...): 任务没有运行? 如果启用了异步任务,则异步任务的 UI 命令 *previous* 不起作用 什么时候使用“异步”而不是返回新的Task.Run任务? 异步任务没有结束 转换功能 <object, Task> 到功能 <T, Task> 在运行时 Actor定时器 - 注册定时器参数 - 为什么Func <object,Task>而不是Func <Task> 获取功能的结果 <object> 当对象是任务时 <Something>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM