为什么Unity的StartCoroutine有没有分配工作?

H. *_*leh -1 c# unity-game-engine

我试过搜索但是在解释共同例程系统的所有线程之间丢失了但没有详细说明.我已经知道StartCoroutine返回一个Co-routine,所以我试着查看是否有某种隐式运算符重载为void返回类型甚至尝试过,但它没有用,我什么都没发现.老实说我只能想到,你可以说我是初学者这个问题没有具体的目标,我真的很感兴趣.提前致谢

编辑:我不作出清楚我的问题道歉:怎么能说都StartCoroutine(example());Coroutine myCoroutine = StartCoroutine(example())?如果返回类型是Coroutine,第一个如何像void一样工作?

Eri*_*ert 7

相比

StartCoroutine(example());
Run Code Online (Sandbox Code Playgroud)

Coroutine myCoroutine = StartCoroutine(example());
Run Code Online (Sandbox Code Playgroud)

void如果返回类型是第一个如何工作Coroutine

你的规则倒退了.C#中的规则不是"非void方法必须分配或使用其返回值".规则恰恰相反:void方法只能用作语句.

如果使用非void方法作为语句,编译器将生成丢弃返回值的代码.

这是否是一个聪明的事情,编译器无法决定.

然而,这只有情况下某些表达式可以用作报表; 不出所料,它们是那些对副作用有用的表达方式.他们是:

  • 方法调用
  • 作业(是的,作业是表达式)
  • 递增/递减
  • 构造函数调用("new") - 这很少见
  • 等待着

所以你可以说:

M();
x = 123;
x++;
new Abc();
await someTask;
Run Code Online (Sandbox Code Playgroud)

但不是

2 + 2;
(string)M();
Run Code Online (Sandbox Code Playgroud)

等等.

  • Eric,我不知道你是否使用Unity3d,但只想告诉你Unity在.NET 2.0 PCL上运行,并且Linq引入了大约3.5个细节.所以你不能在其中使用async/await (仍然赞成你的答案,因为它非常好,只是不想让你专注于异步/等待一个unity3d问题太多). (2认同)