Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用管道和符号传递多个枚举值之间的差异_C#_.net_Parameters_Enums_Parameter Passing - Fatal编程技术网

C#使用管道和符号传递多个枚举值之间的差异

C#使用管道和符号传递多个枚举值之间的差异,c#,.net,parameters,enums,parameter-passing,C#,.net,Parameters,Enums,Parameter Passing,C#接受这一点: this.MyMethod(enum.Value1 | enum.Value2); 这是: this.MyMethod(enum.Value1 & enum.Value2); 有什么区别吗?当您执行时,您可以同时选择这两个选项。当您执行&时,您只需要选择重叠的部分。 请注意,只有将[Flags]属性应用于枚举时,这些运算符才有意义。有关此属性的完整说明,请参阅 例如,以下枚举: [Flags] public enum TestEnum { Value1 =

C#接受这一点:

this.MyMethod(enum.Value1 | enum.Value2);
这是:

this.MyMethod(enum.Value1 & enum.Value2);

有什么区别吗?

当您执行
时,您可以同时选择这两个选项。当您执行
&
时,您只需要选择重叠的部分。

请注意,只有将
[Flags]
属性应用于枚举时,这些运算符才有意义。有关此属性的完整说明,请参阅

例如,以下枚举:

[Flags]
public enum TestEnum
{
    Value1 = 1,
    Value2 = 2,
    Value1And2 = Value1 | Value2
}
以及一些测试用例:

var testValue = TestEnum.Value1;
在此,我们测试
testValue
value1和2
重叠(即是以下内容的一部分):

这里,我们测试
testValue
是否正好等于
value1和2
。这当然不是事实:

if (testValue == TestEnum.Value1And2)
    Console.WriteLine("testValue is equal to Value1And2"); // Will not display!
这里,我们测试
testValue
Value2
的组合是否完全等于
value1和2

if ((testValue | TestEnum.Value2) == TestEnum.Value1And2)
    Console.WriteLine("testValue | Value2 is equal to Value1And2");

一个是按位or,另一个是按位and。在前一种情况下,这意味着在一个或另一个中设置的所有位都在结果中设置。在后一种情况下,这意味着在结果中设置所有公共位和在两者中设置的位。你可以在维基百科上阅读

例如:

enum.Value1 = 7  = 00000111
enum.Value2 = 13 = 00001101
然后

这会将两个枚举值按位“或”组合在一起,因此如果
enum.Value
为1,而
enum.Value2
为2,则结果将是3的枚举值(如果存在,否则将仅为整数3)


这将两个枚举值按位“和”组合在一起,因此如果
enum.Value
为1,而
enum.Value2
为3,则结果将是1的枚举值。

这个问题有一个很好的解释:

枚举参数可以是二进制数,例如

enum WorldSides
{
    North=1,
    West=2,
    South=4,
    East=8
}

WorldSides.North | WorldSides.West = both values -> 3
if (ws & WorldSides.North)
{
     //  ws has north component
}
因此,|用于组合值

例如,使用(&T)去除部分值

enum WorldSides
{
    North=1,
    West=2,
    South=4,
    East=8
}

WorldSides.North | WorldSides.West = both values -> 3
if (ws & WorldSides.North)
{
     //  ws has north component
}

传递
enum.Value1&enum.Value2
的可能性很小。我同意你的看法,这个答案是最好的回答
this.MyMethod(enum.Value1 & enum.Value2);
enum WorldSides
{
    North=1,
    West=2,
    South=4,
    East=8
}

WorldSides.North | WorldSides.West = both values -> 3
if (ws & WorldSides.North)
{
     //  ws has north component
}