相关疑难解决方法(0)

为什么枚举权限通常有0,1,2,4值?

为什么人们总是使用enum值0, 1, 2, 4, 8而不是0, 1, 2, 3, 4

这与位操作等有关吗?

我真的很感激有关如何正确使用它的小样本片段:)

[Flags]
public enum Permissions
{
    None   = 0,
    Read   = 1,
    Write  = 2,
    Delete = 4
}
Run Code Online (Sandbox Code Playgroud)

c# permissions enums flags

157
推荐指数
5
解决办法
2万
查看次数

标志与Web服务

我有一个标志属性枚举,它位于Web服务后面,如下所示:

[Serializable,Flags]
public enum AccessLevels
{
    None = 0,
    Read = 1,
    Write = 2,
    Full = Read | Write
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我的网络服务的消费者没有枚举的原始常量值.生成的代理类客户端端具有以下内容:

{
   None = 1,
   Read = 2,
   Write = 4,
   Full = 8
}
Run Code Online (Sandbox Code Playgroud)

因此,当消费者检查"读取"访问时,即使"testItem"为"Full",这也将是假的.

((testItem & Svc.Read) == Svc.Read)
Run Code Online (Sandbox Code Playgroud)

如何通过Web服务正确提供标志?

编辑:

根据这篇文章,我可能无法做我想做的事情.Ivan Krivyakov说

Enum的透明度不完美

事实证明,枚举并不像我们希望的那样透明.有三个棘手的问题:

  1. 如果服务器端代码声明枚举并为其成员分配特定的数值,则客户端将无法看到这些值.
  2. 如果服务器端代码声明带有"复合"掩码值的[Flags]枚举(如白色=红色|绿色|蓝色),则它在客户端没有正确反映.
  3. 如果服务器或客户端发送超出枚举范围的"非法"值,则会在另一侧的XML反序列化器中导致异常.

所以我想知道这只是一个限制,是不可能的.

.net c# flags web-services

6
推荐指数
1
解决办法
3593
查看次数

枚举标志检查标志始终返回true

我必须做一些非常愚蠢的事情,但我看不清楚是什么.在我有一个简单的控制台应用程序;

[Flags]
public enum ConsoleStates : byte
{
    TopLevel,
    All,
    MainMenu,
    SingleLeagueSelected,
}
Run Code Online (Sandbox Code Playgroud)

然后

public class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.StartUp(args);
    }

    private bool CheckFlag(ConsoleStates targetVal, ConsoleStates checkVal)
    {
        return ((targetVal & checkVal) == checkVal);
    }

    private void StartUp(string[] args)
    {
        int x = 0;
        ConsoleStates states = (ConsoleStates.All | ConsoleStates.MainMenu);
        if (CheckFlag(states, ConsoleStates.SingleLeagueSelected))
        {
            x++;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题X最后应该为零,但它始终是1.据我所知,它应该做一点明智的操作并检查是否有单一的候选,并返回false.

这很奇怪,我所有的谷歌搜索说这很简单,只是有效,但对于我的生活,我无法得到它./羞愧地垂头丧气.

c# enums bitwise-operators bitwise-and

0
推荐指数
1
解决办法
363
查看次数

&运算符,带有C#中的枚举值

我有以下代码并Console.WriteLine返回,Bottom即使Bottom不在两个枚举表达式中.

在下面给出的代码片段中返回Bottom背后的逻辑是什么?我对&运算符的理解是它返回公共部分,但在这种情况下,两个枚举表达式之间没有任何共同之处.

void Main()
{
    Console.WriteLine(( Orientations.Left | Orientations.Bottom) & 
                     (Orientations.Right| Orientations.Top));//returns Bottom
}


[Flags]
public enum Orientations {
Left = 0, Right= 1, Top=2, Bottom =3
};
Run Code Online (Sandbox Code Playgroud)

c# enums

0
推荐指数
2
解决办法
2919
查看次数