5

リストに対して Linq クエリを実行すると、このエラーがスローされます。

Unity3D 3.0 を C# で使用しています (Unity3D は Mono 2.6 を使用しています)。私の知る限り、Unity3D はシングルスレッドです。ベースクラスを継承する「スクリプト」(c# .cs ファイル) を「GameObject」にアタッチすることで機能します。また、Unity はスクリプトのインスタンス化とシリアル化を制御するため、コンストラクターは使用できません。

RoadNodes と RoadCurves への参照を保持する RoadNetwork スクリプトがあります。どちらもシングルトンを介して RoadNetwork を見つけ、登録/登録解除します。ゲームオブジェクトに接続するという大変な作業を行う「ミニ ファクトリ」を RoadNode と RoadCurve に配置しました。

RoadNode は最初に RoadNetwork をチェックして、同じ位置にノードが存在しないことを確認します。次のようにします。

public static RoadNode2 New(float x, float y, float z)
{
    //First try to find an existing one
    var rn = RoadNetwork.Instance.GetNodeAtPosition(new Vector3(x, y, z))
             ?? UnityReferenceHelper.GetNewGameObjectFor<RoadNode2>(
                 "RoadNode_" + (RoadNetwork.Instance.Nodes.Count + 1).ToString("D3"),
                 RoadNetwork.Instance.transform.FindChild("Nodes"));

    rn.Position = new Vector3(x, y, z);

    rn.gameObject.active = true;

    return rn;
}

RoadNetwork の適切な方法は次のとおりです。

public RoadNode2 GetNodeAtPosition(Vector3 position)
{
    var tempList = new List<RoadNode2>();

    return tempList.Single(x => x.Position == position);
}

tempList は問題を絞り込む試みでしたが、まったく同じエラーが発生します。「Nodes.Single(...」である必要がありますが、問題があるとは思えません。Linq クエリを New() メソッドで直接呼び出すと、同じエラーが発生します。

そうです、この Exception はスローされ、その tempList.Single() 行を示します。理由は何でしょうか?

4

3 に答える 3

15

someEnumerable.Single(...)に要素が 1 つだけない場合は、例外がスローされsomeEnumerableます。空のリストであると宣言したばかりtempListなので、常に例外がスローされます。

null要素がない場合に取得する場合は、 を使用しますSingleOrDefault(列挙型に複数の要素が含まれている場合でも、これは例外をスローします。)列挙型に任意の数の要素を含めることができるように、最初Firstの要素が必要な場合は、 (列挙型に要素が含まれていない場合は例外をスローします) またはFirstOrDefault(ケースに入れて返却null)。

最後に、特定の述語に一致するリストの要素があるかどうかを単純に確認したい場合は、 を使用しますAny

于 2010-10-13T05:45:47.573 に答える
0

Unity でシングルトン パターンを実装する方法に問題があるようです。リストが初期化されていないことを意味するリストをチェックするときに null 参照例外が発生した場合は、おそらくシングルトンをインスタンス化していないか、インスタンス化したシングルトンにアクセスしていません。

私は通常、次のように最初のアクセスでインスタンス化して初期化する GameObject にアタッチされたシングルトン MonoBehaviour を使用します。

http://answers.unity3d.com/questions/156746/singleton-and-monobehaviour-in-editor.html

于 2012-10-29T07:30:01.107 に答える
0

ドメニックが言いたかったのは、複数の要素が述語に一致するたびに .Single() がエラーをスローするということだったと思います。コレクション someEnumerable には、取得しようとしているシングルトン (プログラミング パターンではない) の重複コピーが含まれている必要があります。

于 2012-10-28T06:43:23.767 に答える