Unity 5.3 非泛型类型错误与 WeakReference
Unity 5.3 non-generic type error with WeakReference
我在 Visual Studio Community 2015 中使用 Unity 5.3.5f1,当我尝试将 WeakReference 与泛型一起使用时,我不断收到错误消息:"The non-generic type `System.WeakReference' cannot be used with the type arguments"。我知道 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 中加载脚本,它不会抱怨。任何帮助,将不胜感激。谢谢
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...
}
[将评论转换为答案]
经验法则:如果它在带有最新 .NET FW 的 VS 中工作但在 Unity(mono,.NET v2.0)中不工作,则它要么是错误,要么是实现细节。无论哪种方式,您都需要解决方法。
至于你在评论中的问题。从 Java 项目移植到 Unity 很可能是一个挑战。您最好准备好遇到此类问题。在这种情况下,您要么必须再次解决问题,要么进行重构。
为此,我不建议将 "hacking things" 加入引擎(就像你提到的,WeakReference 的单声道源代码)。
它可能有效,但如果无效,则您无法从 Unity 或此处获得任何帮助,因为您刚刚构建了自己的独特框架。长话短说(恕我直言)它迟早会适得其反。
Unity 是一个游戏引擎,所以后面的 Mono/.NET 只是用于脚本,而不是用于全面的 OO 编程。原因是,在游戏引擎中,您创建的大多数项目都是独立的,生活在自己的小泡泡中,而不是服务于单一目的的强大应用程序。
您可以制作 class 层次结构、抽象、嵌套和密封等 "on a level" 但对此有严重的(和逻辑上的)限制,因为这种 'implementation detail' 对于游戏引擎来说并不重要。
因此,再次,如果您遇到问题解决方法(即摆脱 WeakReference 并找出为什么它最初对 "early GC" 特定对象很重要)或重构(考虑在游戏引擎中可以达到什么目的编码为 Java).
希望这对您有所帮助!
干杯!
我在 Visual Studio Community 2015 中使用 Unity 5.3.5f1,当我尝试将 WeakReference 与泛型一起使用时,我不断收到错误消息:"The non-generic type `System.WeakReference' cannot be used with the type arguments"。我知道 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 中加载脚本,它不会抱怨。任何帮助,将不胜感激。谢谢
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...
}
[将评论转换为答案]
经验法则:如果它在带有最新 .NET FW 的 VS 中工作但在 Unity(mono,.NET v2.0)中不工作,则它要么是错误,要么是实现细节。无论哪种方式,您都需要解决方法。
至于你在评论中的问题。从 Java 项目移植到 Unity 很可能是一个挑战。您最好准备好遇到此类问题。在这种情况下,您要么必须再次解决问题,要么进行重构。
为此,我不建议将 "hacking things" 加入引擎(就像你提到的,WeakReference 的单声道源代码)。
它可能有效,但如果无效,则您无法从 Unity 或此处获得任何帮助,因为您刚刚构建了自己的独特框架。长话短说(恕我直言)它迟早会适得其反。
Unity 是一个游戏引擎,所以后面的 Mono/.NET 只是用于脚本,而不是用于全面的 OO 编程。原因是,在游戏引擎中,您创建的大多数项目都是独立的,生活在自己的小泡泡中,而不是服务于单一目的的强大应用程序。
您可以制作 class 层次结构、抽象、嵌套和密封等 "on a level" 但对此有严重的(和逻辑上的)限制,因为这种 'implementation detail' 对于游戏引擎来说并不重要。
因此,再次,如果您遇到问题解决方法(即摆脱 WeakReference 并找出为什么它最初对 "early GC" 特定对象很重要)或重构(考虑在游戏引擎中可以达到什么目的编码为 Java).
希望这对您有所帮助!
干杯!