C# 为什么编译器在I';我没有右键单击UI元素
当我单击空空间时,编译器在文件List.cs中给出了一个错误ArgumentOutOfRangeException,但如果我单击UI元素,它不会给出错误。但是如果我有支票怎么会出错呢C# 为什么编译器在I';我没有右键单击UI元素,c#,unity3d,C#,Unity3d,当我单击空空间时,编译器在文件List.cs中给出了一个错误ArgumentOutOfRangeException,但如果我单击UI元素,它不会给出错误。但是如果我有支票怎么会出错呢 if (results != null) 这是我的代码: public void Update() { if (Input.GetKey(KeyCode.Mouse1)) { eventData = new PointerEventData(eventSystem);
if (results != null)
这是我的代码:
public void Update()
{
if (Input.GetKey(KeyCode.Mouse1))
{
eventData = new PointerEventData(eventSystem);
eventData.position = Input.mousePosition;
List<RaycastResult> results = new List<RaycastResult>();
_raycaster.Raycast(eventData, results);
if (results != null)
{
if (results[0].gameObject.tag == "ItemIcon")
{
if(currentMenu != null)
{
Destroy(currentMenu);
}
currentMenu = Instantiate(SplitMenu, transform);
}
}
}
}
public void Update()
{
if(Input.GetKey(KeyCode.Mouse1))
{
eventData=新点eventData(eventSystem);
eventData.position=Input.mousePosition;
列表结果=新列表();
_raycaster.Raycast(事件数据、结果);
如果(结果!=null)
{
如果(结果[0].gameObject.tag==“ItemIcon”)
{
如果(当前菜单!=null)
{
销毁(当前菜单);
}
currentMenu=实例化(拆分菜单、转换);
}
}
}
}
我的最佳猜测是您正在检查结果!=null,但您并没有检查结果中是否包含任何元素。因此,对空数组使用结果[0]会导致您看到ArgumentOutOfRangeException
将
和&results.Any()
添加到if检查中应该可以解决此问题。最佳选项:我们需要使用results.Count!=0
而不是null
1. List<RaycastResult> results = new List<RaycastResult>();
_raycaster.Raycast(eventData, results);
2. if (results != null)
{
3. if (results[0].gameObject.tag == "ItemIcon")
.Any()
比.Count>0更好,因为它意味着“列表中有东西”,而不是“计数大于0”。请尝试results.Count!=0 而不是<代码> null 实际上,请考虑<代码>如果(结果!= NULL和RESULL ANY()){…
。异常很可能是您在空集合中查找第一个元素的结果。顺便说一句,这是您的代码引发的异常,它不是由编译器发出的。Ali Kanat,它帮助了我。谢谢。或者干脆&&result[0]!=null
,因为无论如何只有结果[0]
稍后使用。防止因使用LinQ@derHugo:否,&&result[0]!=null
将引发相同的异常。results.Count!=0
比使用Any
更有效,假设这是一个列表
。如果要避免Linq,也可以使用results.Length>0
(或者是.Count?我已经有一段时间没有使用C了,我不记得Count是否是另一个LInq扩展)。@CodeMonkey:Count()
是一个扩展方法,Count
是IList
/IReadOnlyList
等中的一个属性。Length
是数组上的属性……为了一致性,)
if(results.Any())