是否有可能等待空文字?

Sco*_*ain 9 .net c# asynchronous async-await

你可以等待 C#5+中的任何内容,只要该类型具有一个被调用的函数.GetAwaiter(),它返回一个特殊对象或者具有相同的扩展方法.

Unity3d在其下一个主要版本中将支持async/await.目前在Unity3d中你可以yield return null;在一个协程里面代表"等待下一帧".

我想知道是否有可能制作一个扩展方法,允许你做await null;同样的行为.没有System.Null像有一个System.Void,所以我想不出在扩展方法中放入什么类型.

Eri*_*ert 9

你是正确的,收益率和等待是密切相关的.两者都是当前方法暂停的工作流中的点,控制返回给调用者,并且该方法在将来发生yield/await时在未指定的点恢复.

但是他们在操作上的行为方面却截然不同.它们实际上是彼此的双重身份.当迭代序列的代码要求时,yield 提供.await 在由异步执行任务生成提取值.

Null是一个完全有效的值,因此将它提供给调用者的收益是有意义的.但是null不是一个有效的任务,因此等待尝试从任务中提取是没有意义的.

目前在Unity3d中,您可以返回null; 在协程内部表示"等待下一帧".

在async-await异步工作流中,模拟yield return null;就是return null;.这意味着"通过提供空引用来结束异步工作流的这一部分".如果您打算生成结果为null的任务,为什么不简单地返回null?

让我换一种可能更清楚的方式.显然这毫无意义:

foreach(var x in null)
   Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)

这是完全荒谬的:

var x = await null;
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)

逻辑上这些是相同的.Foreach表示"只要值可用,就从序列中提取值",但null不是序列.类似地,"await"意味着"一旦值可用就从任务中提取值",但null不是任务.

这是关键:异步模拟await不是yield return,它是foreach.这是TIEnumerable<T>或中提取的机制Task<T>.该放的东西T 进入的单子类型yield returnIEnumerable<T>returnTask<T>.


Blo*_*ard 3

无法在文字 null 上定义扩展方法,因为文字null没有类型

\n\n
\n

..我们意识到 null 类型很奇怪。它是一种只有一个值 \xe2\x80\x94 的类型还是?nullable int 的值真的与 null string 的值相同吗?并且可空值类型的值 don\xe2\x80\x99t 已经有一个类型,即可空值类型?

\n
\n\n

和:

\n\n
\n

因此,我们在 C# 3.0 规范中删除了对无用的 \xe2\x80\x9cnull 类型\xe2\x80\x9d 的引用。

\n
\n