Este error se produce al ejecutar una consulta Linq sobre una lista.La operación no es válida debido al estado actual del objeto: Linq en la lista
Estoy usando Unity3D 3.0 con C# (Unity3D usa Mono 2.6). Unity3D, hasta donde yo sé, es de un solo hilo. Funciona al adjuntar "scripts" (archivos c .cs) que heredan una clase base a un "GameObject". Además, Unity controla la instanciación y serialización de scripts para que no pueda usar constructores.
Tengo un script de RoadNetwork que contiene una referencia a RoadNodes y RoadCurves, que ubican RoadNetwork a través de un singleton y se registran/anulan el registro. He puesto "mini-fábricas" en RoadNode y RoadCurve que hacen el trabajo duro de conectarse a un objeto de juego.
RoadNode comprueba primero con RoadNetwork para asegurarse de que tampoco hay ya un nodo en la misma posición, al hacer esto:
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;
}
Cuando el método apropiado en RoadNetwork es:
public RoadNode2 GetNodeAtPosition(Vector3 position)
{
var tempList = new List<RoadNode2>();
return tempList.Single(x => x.Position == position);
}
tempList era un intento de reducir el problema, pero obtengo precisamente el mismo error. Debería ser "Nodes.Single (...", pero dudo que importe. Recibo el mismo error si llamo a la consulta Linq directamente en el método New()
Así que sí, esta excepción arroja puntos yo a esa línea tempList.Single(). ¿Qué iba a ser la razón?
Gracias, yo no sabía algo de eso, pero este no es el error (obtendría una referencia nula).Es que la colección por cualquier razón no es válida debido a su estado. –
Es bastante difícil ayudarle si no publica el error exacto. Además, de acuerdo con http://msdn.microsoft.com/en-us/library/bb155325.aspx, el resultado de usar 'Single' en un enumerable con no exactamente un elemento es' InvalidOperationException', no es ningún tipo de referencia nula excepción. – Domenic
Solo quiero decir que las versiones "OrDefault" funcionaron para mi situación particular. También estoy usando Unity y recibía la misma excepción InvalidOperation. En mi caso, estaba usando 'collection.First()' en LINQ. Cambiarlo a '.FirstOrDefault' lo solucionó. Las versiones "OrDefault" de los métodos LINQ siempre son una apuesta segura, parece. – Aaron