Unity4.x项目移植至Unity2017时CS0177错误的修复方法
解决Unity 4.x移植到2017时的CS0177错误
你碰到的这个CS0177错误,本质是C#编译器的规则严格性升级了——Unity 4.x用的老版本编译器对out参数的赋值检查没那么苛刻,但Unity 2017搭载的新编译器要求所有代码路径在方法返回前,必须给out参数result完成赋值。
咱们拆解下你的代码问题:在do-while循环的if (curHead == curTail)分支里,你只执行了Interlocked.CompareExchange来更新_tail,但完全没给result赋值,之后循环会继续执行。编译器没法预判这个分支之后会不会走到赋值逻辑,所以直接抛出了错误。
修复思路很明确:确保所有可能的代码路径都给result赋上值。结合你的队列逻辑,最合理的调整是把赋值操作提前到分支判断之前,具体修改后的代码如下:
public bool TryDequeue(out T result) { Node<T> curHead; Node<T> curTail; Node<T> next; do { curHead = _head; curTail = _tail; next = curHead.Next; if (curHead == _head) { if (next == null) { result = default(T); return false; } // 提前赋值,确保所有分支都能覆盖到result的赋值 result = next.Item; if (curHead == curTail) { // 这里仅更新tail,result已经完成赋值 Interlocked.CompareExchange<Node<T>>(ref _tail, next, curTail); } else { if (Interlocked.CompareExchange<Node<T>>(ref _head, next, curHead) == curHead) break; } } } while (true); return true; }
这个改动完全符合你的队列逻辑:因为走到这个分支时next肯定不为null(前面已经判断过next == null就直接返回false了),所以next.Item是有效的值。同时编译器能明确看到所有代码路径里result都被赋值了,错误自然就消失了。
内容的提问来源于stack exchange,提问作者nix002
相关产品推荐
相关产品推荐

