Geo*_*e R 5 c# linq unity-game-engine
在List上运行Linq查询时抛出此错误.
我正在使用带有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;
}
Run Code Online (Sandbox Code Playgroud)
RoadNetwork中的适当方法是:
public RoadNode2 GetNodeAtPosition(Vector3 position)
{
var tempList = new List<RoadNode2>();
return tempList.Single(x => x.Position == position);
}
Run Code Online (Sandbox Code Playgroud)
tempList试图缩小问题范围,但我得到了完全相同的错误.它应该是"Nodes.Single(...",但我怀疑它很重要.如果我直接在New()方法中调用Linq查询,我会得到相同的错误.
所以是的,这个Exception会抛出并指向我的tempList.Single()行.原因是什么?
Dom*_*nic 15
someEnumerable.Single(...)如果没有一个元素,则抛出异常someEnumerable.鉴于您刚刚声明tempList为空列表,它将始终抛出异常.
如果要检索null是否没有元素,请使用SingleOrDefault.(如果可枚举包含多个元素,这仍然会抛出异常.)如果您想要第一个元素,以便允许您的枚举包含任意数量的元素,请使用First(如果枚举不包含任何元素,则抛出异常)或FirstOrDefault(null在这种情况下返回).
最后,如果您只想检查列表中是否存在与给定谓词匹配的任何元素,请使用Any.
| 归档时间: |
|
| 查看次数: |
30906 次 |
| 最近记录: |