【问题标题】:troubles declaring static enum, C#声明静态枚举的麻烦,C#
【发布时间】:2011-06-01 20:35:35
【问题描述】:

您好,我正在尝试像这样声明一个静态枚举:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Lds.CM.MyApp.Controllers
{
    public class MenuBarsController : Controller
    {
        // Menu Bar enums
        public static enum ProfileMenuBarTab { MainProfile, Edit, photoGallery }

        public ActionResult cpTopMenuBar(string tabSelected)
        {
            ...            

" 但我收到以下错误:“修饰符 'static' 对此项目无效。” 我知道这很简单,但我似乎看不到问题所在。非常感谢!

【问题讨论】:

标签: c# static enums


【解决方案1】:

.Net 中的类型可以是值类型引用类型

值类型 -> enums, structsbuilt-in values types(bool, byte, short, int, long, sbyte, ushort, uint, ulong, char, double, decimal)

引用类型 -> classesinterfacesdelegatesdynamicstrings

所以,如您所见,枚举是类型(如 classesstructsetc)。更准确地说它们是值类型。关于值类型的重要一点是您应该能够从它们创建实例。例如,int 是一个结构(值类型),如果你不能创建一个实例来存储 2、3 或任何数字,它有什么好处?!

这是一般规则 -> 您不能使用 static 修饰符创建自定义值类型(enumsstructs)。

几点:

  • 如果您将enumsstructs 直接写在namespace 中,则它们不能像其他类型一样标记为privateprotected。它们可以只是publicinternal,就像其他类型一样。

  • 1234563 .内部类型的class 类似于类型的namespace,除了您也可以标记内部类型privatepublic

【讨论】:

    【解决方案2】:

    枚举是类型,而不是变量。因此,根据定义,它们是“静态的”,您不需要关键字。

    public enum ProfileMenuBarTab { MainProfile, Edit, PhotoGallery }
    

    【讨论】:

    • 枚举根据定义是“静态的”,但我们不能在静态类中使用它,为什么?
    • @user2323308 10.1.1.3 静态类 静态类不能实例化,不能用作类型,只能包含静态成员...静态类只能包含静态成员(§10.3.7)。 请注意,常量和嵌套类型被归类为静态成员10.3.7 静态成员和实例成员 类的成员要么是静态成员要么是实例成员... ...常量或类型声明隐式声明了一个静态成员。 ref :docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
    【解决方案3】:

    您不需要将其定义为静态。当编译枚举类型时,C# 编译器会将每个符号转换为类型的常量字段。例如,编译器处理前面显示的 Color 枚举 就好像您编写了类似于以下的代码:

    internal struct Color : System.Enum {
                // Below are public constants defining Color's symbols and values
                public const Color White  = (Color) 0;
                public const Color Red    = (Color) 1;
                public const Color Green  = (Color) 2;
                public const Color Blue   = (Color) 3;
                public const Color Orange = (Color) 4;
                // Below is a public instance field containing a Color variable's value
                // You cannot write code that references this instance field directly
                public Int32 value__;
    }
    

    【讨论】:

      【解决方案4】:

      枚举是一种类型,而不是值。修饰符 static 在那里没有多大意义。

      【讨论】:

      • 类也是一种类型,可以是静态的。并且由于您无法使用该类的实例访问此枚举,因此它肯定是静态的,因此应该使用静态修饰符,其他一切都不一致,但又是 C#..
      【解决方案5】:

      您正在尝试将枚举声明设为静态,即ProfileMenuBarTab 类型的字段。要在一个类中声明一个类(或其他),请忽略静态。

      【讨论】:

        【解决方案6】:

        取出static.
        枚举是类型,而不是成员;没有静态或非静态枚举的概念。

        您可能正在尝试为您的类型创建一个静态字段,但这与类型声明无关。
        (尽管您可能不应该制作静态字段)

        另外,you should not make public nested types

        【讨论】:

        • 谢谢,这是一个漫长的夜晚。我删除了“静态”,一切都很好。此外,我正在阅读您的链接,看来嵌套枚举是您规则的一个例外。 “嵌套枚举器和受保护类型不受此规则约束。”
        • @SLaks,这个规则例外对你有意义吗?
        • @Ray:枚举器(IEnumerator<T> 实现)与枚举无关。
        • “嵌套枚举器和受保护类型不受此规则约束。”
        • @SLaks,他有一个公共枚举,你发布了一个链接说不要公开嵌套类型,我只是指出根据你链接的页面,枚举是豁免的,所以对公开。
        猜你喜欢
        • 2015-04-26
        • 2012-03-22
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        相关资源
        最近更新 更多