使用WeakReference的Unity 5.3非泛型类型错误

时间:2016-07-04 13:49:58

标签: c# unity3d unity5

我在使用Unity 5.3.5f1和Visual Studio Community 2015时遇到了错误:"非泛型类型`System.WeakReference'不能与类型参数一起使用"当我尝试使用带有泛型的WeakReference时。我知道here支持它。

我的代码片段:

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Collections;

namespace aim4.util
{
 /** The initial ID */
    private int initId;
    /** The next ID */
    private int nextId;
    /** A mapping from IDs to weak references of objects */
    private SortedDictionary<int, WeakReference<T>> idToObj =
      new SortedDictionary<int, WeakReference<T>>();

我感觉它与Unity有关,因为如果我在项目之外的VS中加载脚本,那么它就不会抱怨。任何帮助,将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

[将评论转换为回答] 经验法则:如果它在VS中使用最新的.NET FW但在Unity(单声道,.NET v2.0)中不起作用,那么它既可以是bug,也可以是实现细节。你需要以任何一种方式解决
截至评论中的问题。从Java项目移植到Unity很可能是一个挑战。你最好准备碰到那种问题。在这种情况下,您要么必须再次解决,要么重构。
为此,我不会推荐&#34;黑客攻击事物&#34;进入引擎(就像你提到的那样,WeakReference的单声道源代码) 它可能会起作用但是如果不是这样,你既不能从Unity那里得到任何帮助,也不会在这里得到任何帮助,因为你刚刚构建了自己独特的框架。长话短说(恕我直言)它迟早会适得其反。
Unity是一个游戏引擎,因此Mono / .NET仅用于编写脚本,而不是用于全面的OO编程。原因是,在游戏引擎中,您创建的大多数项目都是独立的,生活在他们自己的小泡泡中,而不是用于单一目的的强大应用程序。 您可以在一个级别上制作类层次结构,抽象,嵌套和密封等等。但是由于这种“实施细节”,有严重的(和逻辑的)限制。对游戏引擎来说并不重要
所以,再次,如果你碰到一个问题的解决方法(即摆脱WeakReference并找出它为什么最初对于#34;早期GC&#34;特定对象)或重构(想想在游戏中会起作用的东西)用Java编码的目的引擎。

希望这有帮助!
干杯!

答案 1 :(得分:0)

WeakReference确实是通用的。但是,看起来您使用的是T类型,而不是代码中的实际类型。

尝试将T替换为您要使用的实际类型。例如:

private SortedDictionary<int, WeakReference<GameObject>> idToObj =
  new SortedDictionary<int, WeakReference<GameObject>>();

似乎还有non-generic version

你应该在没有类型参数的情况下使用它,然后使用强制转换来获得你想要的类型:

private SortedDictionary<int, WeakReference> idToObj =
  new SortedDictionary<int, WeakReference>();

var obj = idToObj[0].Target as GameObject;

if (obj)
{
    // Do stuff... 
}