【问题标题】:InvalidCastException while passing Button as parameter C#将 Button 作为参数传递时出现 InvalidCastException C#
【发布时间】:2016-07-10 22:57:28
【问题描述】:

我遇到了一个非常奇怪的问题,我有以下收藏:

public static readonly IEnumerable<Button> AuraButtons =
        FindObjectsOfType<Button>().Where(button => button.tag == "Aura_Button");

我正在寻找具有特定名称的按钮并将其传递给方法:

UpdateAuraIcon(Settings.AuraButtons.Single(button => button.name == 
        "Aura_Button_" + 1), panel); // 1 is just random number

AuraButtons 确实包含指定的按钮,但是我得到以下异常:InvalidCastException: Cannot cast from source type to destination type. 该方法将按钮作为参数但它不会接受它?这就是方法签名

private static void UpdateAuraIcon(Button auraButton, GameObject panel)

我什至不能传递一个整数作为参数:

private static void UpdateAuraIcon(int order)
UpdateAuraIcon(1);

仍然抛出同样的异常。

布尔 c__AnonStorey3:m__B (Button)+0x0 C# 对象 System.Linq.Enumerable:Single (IEnumerable1, Func2, Fallback)+0x22 at :-1
对象 System.Linq.Enumerable:Single (IEnumerable1, Func2)+0xa at :-1 Void Assets.Scripts.Manager:UpdateSelectedAuraPanel (AuraOrder)+0x97 C# Void Assets.Scripts.Manager:SetCurrentAura (GameObject)+0x74 C# 无效 UnityEngine.Events.InvokableCall1:Invoke (Object[])+0x3a at C:\buildslave\unity\build\Runtime\Export\UnityEvent.cs:184 C# Void UnityEngine.Events.CachedInvokableCall1:Invoke (Object[])+0x7 at C:\buildslave\unity\build\Runtime\Export\UnityEvent.cs:302 C# 无效 UnityEngine.Events.InvokableCallList:Invoke (Object[])+0x53 at C:\buildslave\unity\build\Runtime\Export\UnityEvent.cs:630 C# 无效 UnityEngine.Events.UnityEventBase:Invoke (Object[])+0xd at C:\buildslave\unity\build\Runtime\Export\UnityEvent.cs:765 C# 无效 UnityEngine.Events.UnityEvent:Invoke ()+0x7 at C:\buildslave\unity\build\Runtime\Export\UnityEvent_0.cs:53 C# void Assets.Scripts.Manager:CheckKeys (Dictionary2, Predicate1)+0x2d C# void Assets.Scripts.Manager:Update ()+0x89 C#

【问题讨论】:

  • 你能发布异常堆栈跟踪和相关代码吗?推荐阅读-meta.stackoverflow.com/questions/260648/….
  • @EugenePodskal 添加了堆栈跟踪(是吗?)
  • 可能问题出在FindObjectsOfType 并且仅在真正评估集合时发生;通过使用 Single(需要遍历整个序列以确保它是真正的单)
  • 我尝试使用 foreach 遍历集合,当我找到一个值时,我刚刚跳出循环,将结果存储在变量中,然后将其传递给方法仍然没有运气,同样的异常被抛出..
  • IEnumerable&lt;Button&gt; a = Settings.AuraButtons.Where(button =&gt; button.name == "Aura_Button_" + order); 返回 1 个项目的集合。

标签: c# user-interface unity3d


【解决方案1】:

尝试使用“object”作为被调用方法的类型,然后将其转换为方法内的“Button”类型。

private static void UpdateAuraIcon(object auraButton, GameObject panel)
{
    Button btn = (Button)auraButton;
...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2020-04-25
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    相关资源
    最近更新 更多