当在List上运行Linq查询时,会抛出此错误。
我使用的是带有C#的Unity3D 3.0(Unity3D使用Mono 2.6)。据我所知,Unity3D是单线程的。它通过将继承基类的“脚本”(c# .cs文件)附加到“GameObject”上来工作。此外,Unity控制脚本的实例化和序列化,因此您不能使用构造函数。
我有一个RoadNetwork脚本,它保存对RoadNodes和RoadCurves的引用,两者都通过单例定位RoadNetwork并注册/注销自己。我在RoadNode和RoadCurve中放置了“迷你工厂”,这些工厂完成了将自己连接到游戏对象的艰苦工作。
RoadNode首先通过执行以下操作与RoadNetwork进行检查,以确保该位置没有已经存在的节点:
我使用的是带有C#的Unity3D 3.0(Unity3D使用Mono 2.6)。据我所知,Unity3D是单线程的。它通过将继承基类的“脚本”(c# .cs文件)附加到“GameObject”上来工作。此外,Unity控制脚本的实例化和序列化,因此您不能使用构造函数。
我有一个RoadNetwork脚本,它保存对RoadNodes和RoadCurves的引用,两者都通过单例定位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(...",但我怀疑这并不重要。如果我在New()方法中直接调用Linq查询,我会得到相同的错误。
所以是的,这个异常抛出并指向那个tempList.Single()行。原因是什么呢?
InvalidOperationException
异常,而不是任何一种空引用异常。 - Domeniccollection.First()
。将其更改为.FirstOrDefault
即可解决问题。似乎“OrDefault”版本的LINQ方法总是一个安全的选择。 - Aaron