问题
Why does this return False
public enum Directions { Up, Down, Left, Right }
static void Main(string[] args)
{
bool matches = IsOneOf(Directions.Right, Directions.Left, Directions.Right);
Console.WriteLine(matches);
Console.Read();
}
public static bool IsOneOf(Enum self, params Enum[] values)
{
foreach (var value in values)
if (self == value)
return true;
return false;
}
while this returns True?
public static bool IsOneOf(Enum self, params Enum[] values)
{
foreach (var value in values)
if (self.Equals(value))
return true;
return false;
}
回答1:
Enum does not implement a == equality operator but it does override the Equals method.
Since it does not implement ==, the system performs a reference equality check. Note that System.Enum is a class not a structure. Hence, values such as Directions.Left are boxed. In this particular case, the boxed objects end up being separate objects, hence they fail a reference equality test.
The compiler understands == for concrete Enum types (such as Directions), but the compiler does not do this special processing against the System.Enum type.
回答2:
As JB says, boxing. You can see this by changing from Enum to Directions:
public static bool IsOneOf(Directions self, params Directions[] values)
{
foreach (var value in values)
if (self == value)
return true;
return false;
}
true is returned.
来源:https://stackoverflow.com/questions/652673/enum-boxing-and-equality