This question already has answers here:
Why does == not work while comparing two object type variables boxed with same int value
                                
                                    (3个答案)
                                
                        
                                在4个月前关闭。
            
                    
我试图为or运算符提出一个速记解决方案。所以我想出了类似的东西,但是结果总是错误的。

有人可以提供一些有关如何解决此问题的建议吗?这会完全起作用吗?如果没有,还有其他类似的解决方案吗?

附言我知道这个问题以前曾被问过,但不幸的是,没有一种解决方案适合我的需求。

代码:

public static bool IsEqualsTo(object o, params object[] p)
{
    for (int i = 0; i < p.Length; i++)
    {
        if (o == p[i])
        { return true; }
    }
    return false;
}


因此,例如:


  从if(MovementState == PMovementState.Walking || MovementState == PMovementState.Idle)开始
  
  到if(IsEqualsTo(MovementState,PMovementState.Walking,PMovementState.Idle))


要么


  从if(input.text ==“ text” || input.text ==“ text2” || input.text ==“ text3”)
  
  到if(IsEqualsTo(input.text,“ text”,“ text2”,“ text3”))

最佳答案

您可以使用通用版本来避免装箱/拆箱:

public static bool IsEqualsTo<T>(T o, params T[] p)
{
    var comparer = EqualityComparer<T>.Default; // make it an optional parameter
    for (int i = 0; i < p.Length; i++)
    {
        if (comparer.Equals(o, p[i]))
            return true;
    }
    return false;
}


出现此问题的原因是,如果传递了诸如enum(struct)之类的值类型,则将Object参数置于框内。这将导致==返回false,因为它不是相同的引用。如上所示,使用Equals可以解决此问题,并使用泛型使其更有效。

如前所述,您还可以使用LINQ缩短方法的主体:

return p.Contains(o, comparer);

关于c# - OR运算符问题的可能速记解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57359686/

10-11 22:25
查看更多