我在使用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中加载脚本,那么它就不会抱怨。任何帮助,将不胜感激。感谢。
答案 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...
}