C# Unity 5.3带有WeakReference的非泛型类型错误

C# Unity 5.3带有WeakReference的非泛型类型错误,c#,unity3d,unity5,C#,Unity3d,Unity5,我在Visual Studio Community 2015中使用Unity 5.3.5f1,当我尝试将WeakReference与泛型一起使用时,不断出现错误:“非泛型类型`System.WeakReference'不能与类型参数一起使用”。我知道它得到了很多人的支持 我的代码片段: using System; using System.Diagnostics; using System.Collections.Generic; using System.Collections; names

我在Visual Studio Community 2015中使用Unity 5.3.5f1,当我尝试将WeakReference与泛型一起使用时,不断出现错误:“非泛型类型`System.WeakReference'不能与类型参数一起使用”。我知道它得到了很多人的支持

我的代码片段:

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>>();
使用系统;
使用系统诊断;
使用System.Collections.Generic;
使用系统集合;
名称空间aim4.util
{
/**初始ID*/
私有int initId;
/**下一个ID*/
内克斯泰德私人酒店;
/**从ID到对象弱引用的映射*/
专用分类词典idToObj=
新的SortedDictionary();

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

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

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

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

看来也有一个问题

您应该在不带类型参数的情况下使用此命令,然后使用强制转换来获取所需的类型:

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

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

if (obj)
{
    // Do stuff... 
}
private SortedDictionary idToObj=
新的SortedDictionary();
var obj=idToObj[0]。目标为游戏对象;
如果(obj)
{
//做些事情。。。
}
[将注释转换为答案]
拇指法则:如果它在VS和最新的.NET FW中工作,但在Unity(mono,.NET v2.0)中不工作,那么它要么是一个bug,要么是一个实现细节。您需要解决这两种问题。

正如您在评论中提出的问题。从Java项目移植到Unity很可能是一个挑战。您最好准备好遇到此类问题。在这种情况下,您要么重新解决,要么重构。
因此,我不建议将“黑客技术”引入引擎(就像您提到的,WeakReference的mono源代码)。
它可能会起作用,但如果不起作用,你就无法从Unity或这里得到任何帮助,因为你刚刚建立了自己独特的框架。长话短说(IMHO)迟早会适得其反。
Unity是一个游戏引擎,因此Mono/.NET的背后只是用于编写脚本,而不是用于全面的OO编程。原因是,在游戏引擎中,您创建的大多数项目都是独立的,存在于它们自己的小气泡中,而不是用于单一目的的健壮应用程序。
您可以在“一个级别”上创建类层次结构、抽象、嵌套和密封等,但在这方面存在严重(和逻辑)限制,因为这种“实现细节”对于游戏引擎并不重要。

因此,同样,如果您遇到一个问题解决方法(即,摆脱WeakReference并找出“早期GC”特定对象最初为什么很重要)或重构(仔细考虑在游戏引擎中用Java编码的目的是什么)。

希望这有帮助!

干杯!

没有。尝试过,但不起作用。由于某种原因,它无法识别该类的存在,当我检查“系统”下的脚本列表时,该类不会显示。Unity似乎正在使用非通用版本:。您需要从
对象
强制转换为所需的类型。经验法则:如果它在VS中使用最新版本.NETFW但不统一(mono,.NETV2.0)这要么是一个bug,要么是一个实现细节way@Mark你说得对。我发现的一个解决办法是将源代码在线,然后将其添加到我的Unity项目中。这真的是一个糟糕的做法吗?我必须从Java重新编写代码,并且有很多依赖项,所以我真的不想做太多的更改这就是我为什么要这么做的原因。另外,是否可以将您的评论标记为答案?不,但我将其复制粘贴为答案,也扩展为您的评论。谢谢!如果您还没有完成,安装它将允许您将目标框架设置为“Unity 3.5完整基类库”,这将从不允许使用的intellesense类中删除,如
WeakRefrence
(注意,如果您使用的是“unity project”而不是普通的.csproj文件,则无法打开属性页来更改目标框架,但默认情况下它已经是特定目标)谢谢。我想我有点天真,但这是一个相对较小的模拟,而不是一个完整的游戏。但是,是的,我会记住你提到的一切。@Amposter如果这是一个小项目,我会重构(听起来更快),只保留它运行的数学。无论你的决定是什么,祝你好运