使用WeakReference的非泛型类型错误

本文关键字:泛型类型 错误 WeakReference 使用 | 更新日期: 2023-09-27 17:54:46

我在Visual Studio Community 2015中使用Unity 5.3.5f1,我一直得到错误:"非泛型类型"系统。当我试图将WeakReference与泛型一起使用时,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>>();

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

使用WeakReference的非泛型类型错误

[将评论转换为答案]经验法则:如果它可以在VS和最新的。net FW中工作,但不能在Unity (mono, . net v2.0)中工作,这要么是一个bug,要么是一个实现细节。无论哪种方式,你都需要变通。

至于你在评论中提出的问题。从Java项目移植到Unity很可能是一个挑战。你最好准备好遇到这类问题。在这种情况下,您要么必须再次工作,要么进行重构。
因此,我不建议在引擎中"黑东西"(就像你提到的,WeakReference的单一源代码)。它可能会起作用,但如果它不起作用,你就无法从Unity或这里获得任何帮助,因为你刚刚构建了自己独特的框架。长话短说(恕我直言),它迟早会适得其反。
Unity是一个游戏引擎,所以Mono/。NET背后只是用于脚本,而不是用于全面的OO编程。原因是,在游戏引擎中,你创建的大多数道具都是独立的,存在于它们自己的小气泡中,而不是服务于单一目的的强大应用程序。你可以在"一个关卡"上创建类层次、抽象、嵌套和密封等,但这存在严重的(和逻辑上的)限制,因为这种"执行细节"对游戏引擎来说并不重要。
所以,再一次,如果你碰到一个问题的解决方法(例如,摆脱WeakReference并找出为什么它最初对"早期GC"特定对象很重要)或重构(考虑在游戏引擎中为Java编码的目的工作)。

希望这对你有帮助!
干杯!

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

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

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

似乎也有一个非通用版本。

你应该使用这个不带类型参数,然后使用强制转换来获得你想要的类型:

private SortedDictionary<int, WeakReference> idToObj =
  new SortedDictionary<int, WeakReference>();
var obj = idToObj[0].Target as GameObject;
if (obj)
{
    // Do stuff... 
}