перечисление - тип поля класса

Тема в разделе ".NET", создана пользователем iv4258, 20 мар 2008.

  1. iv4258

    iv4258 Гость

    Код (Text):
    enum SomeEnum
    {
    seNormal,
    seExtend
    }

    public class Class1
    {
    public SomeEnum SE;
    }
    выдаёт ошибку:
    :)
    как тада использовать в качестве поля класса тип перечисление?
     
  2. Electro

    Electro Гость

    Error 1 Inconsistent accessibility: field type 'SomeEnum' is less accessible than field 'Class1.SomeEnum'
    Ну практически по русски написано: Модификатор доступа у поля типа 'SomeEnum' меньше чем у
    у поля 'Class1.SomeEnum' поэтому:

    Код (Text):
    public enum SomeEnum
    {
    seNormal,
    seExtend
    }

    public class Class1
    {
    public SomeEnum SE;
    }
     
  3. iv4258

    iv4258 Гость

    :huh: я и забыл что по умолчанию декларируемый класс считается internal
     
  4. Electro

    Electro Гость

    Нет.-prіvate
     
  5. iv4258

    iv4258 Гость

    Для класса в С# используется только два ключевых слова для определения об-
    ласти видимости: publiс и internal.
     
  6. Electro

    Electro Гость

    Ого, это ты где-то вычитал или сам придумал?
     
  7. Pasha

    Pasha Гость

    iv4258, Electro, горячие финские парни.
    1. Оба правы: модификатор доступа private для класса в C# - это на самом деле internal. Доказано рефлектором (с)
    2. Оба неправы: к классам применимы аж 5 разных модификаторов доступа. Правда, некоторые только к вложенным классам, и protectedinternal посчитан отдельным модификатором.
     
  8. iv4258

    iv4258 Гость

    Речь шла о C#, а не о правилах СLS.
    В C#, подчёркиваю, для класса применимы тока два модификатора: public и internal, иначе получите сообщение компилятора:
    "Namespace elements cannot be explicity declared as private, protected, or protectedinternal".
    хотя в IL, если посмотреть на код проги через дизассемблер, класс будет помечен, как приватный.
    Тем не менее IL и C# - всёж разные языковые нотации и соответственно имеют свои правила.

    А ты запусти компилятор и посмотри.
     
  9. Pasha

    Pasha Гость

    iv4258
    Вчитайся в сообщение об ошибке. В нем вообще упоминания про классы нет. А модификатор доступа по умолчанию зависит от места объявления.
    А вообще компилятор на слово private ругается, хотя вчера на работе вроде молчал :) Спишем это на вечерние глюки.
     
  10. Electro

    Electro Гость

    Код (Text):
    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    }
    }

    enum SomeEnum
    {
    seNormal,
    seExtend
    }

    /*public class Class1
    {
    public SomeEnum SE;
    }*/
    }
    ldasm дает:
    Код (Text):
    .class private auto ansi sealed ConsoleApplication1.SomeEnum
    extends [mscorlib]System.Enum
    {
    } // end of class ConsoleApplication1.SomeEnum
    Даже если явно: internal enum SomeEnum{}. все равно private
     
  11. Pasha

    Pasha Гость

    Electro
    Сорри, думал что топик умер.
    Вообще-то начальное утверждение было:
    Для не-вложенных классов в C# действительно используются только public и internal.
    Код вроде
    Код (Text):
        class Class1
    {
    internal class Class2
    {

    }

    protected class Class3
    {

    }
    }
    откомпилиется в
    Код (Text):
    .class auto ansi nested assembly beforefieldinit Class2
    .class auto ansi nested family beforefieldinit Class3
    но утверждать на основе этого что в C# не бывает protected классов, потому что "на самом деле они - family" как-то странно.
     
  12. Electro

    Electro Гость

    Это значит мой ildasm врет ?
    Либо смысла в internal в исх. коде нет ?
     
  13. Pasha

    Pasha Гость

    Это значит что internal в языке C# соответствует нескольким модификаторам в IL. Я ведь специально слово C# выделил, чтобы показать что имею в виду не assembly в il, а именно internal в вполне конкретном языке. Так что твой ildasm врет - он показывет не модификатор доступа C#, а результат его компиляции - модификатор доступа IL. Об этом еще в 9-й мессаге было подробно расписано.
     
  14. Electro

    Electro Гость

    Тогда try...
    Код (Text):
    class Program
    {
    static void Main(string[] args)
    {
    }

    private enum SomeEnum
    {
    seNormal,
    seExtend
    }

    public class Class1
    {
    internal SomeEnum SE;
    }
    }
     
  15. Pasha

    Pasha Гость

    И чем этот код противоречит моему утверждению? Вобще-то как раз и показывает что internal компилируется в разные модификаторы доступа в зависимости от контекста.
     
  16. Electro

    Electro Гость

    Противоречите в трактовке, а не в контексте.
    Какой смыл применять к типу в одной области видимости применять internal?
    Поэтому такой тип(если он не вложен) и компилируется в private, в других случ-х
    ildasm одназначно проставит: .class auto ansi sealed nested assembly для internal
    и .class auto ansi sealed nested private - для private.
     
  17. Pasha

    Pasha Гость

    Electro
    Да какая разница во что он компилируется. iv4258 говорил о модификаторах доступа в языке C#, а не о том, во что они компилируются. А ты почему-то перескакиваешь на CLR. В C# есть анонимные делегаты и типы - в CLR нет. в C# есть конструкция foreach - в CLR нет. В C# есть модификатор internal - в CLR есть 3 вещи в которые он может скомпилироваться. В C# у невложенных классов по умолчанию C#-й модификатор доступа internal - в CLR он станет private. В C# есть смысл "к типу в одной области видимости применять internal" - есть, потому что internal - это не private и не assembly.
     
  18. Electro

    Electro Гость

    Если модификатор не указан(для типа или для члена), в C# он считается private, и все.
    А intrenal позволяет указать что (тип или член), будет доступен в сборке(assembly), и все.
    Во что 3-е intrenal компил-ся я что-то не допонял.
     
  19. Pasha

    Pasha Гость

    Если модификатор не указан для класса, в C# он считается internal, т.е. он будет доступен в сборке. и все. Хотя бы потому, что в C# не бывает private и protected не-вложенных классов, ни явно, ни по-умолчанию. Открой MSDN, и убедись:
    В famorassem. Может и 4-е есть, но я не искал.
     
  20. Electro

    Electro Гость

    Да уж пришлось залезть в MSDN
    Non-nested types can have public or internal declared accessibility and have internal declared accessibility by default. Nested types can have these forms of declared accessibility too, plus one or more additional forms of declared accessibility, depending on whether the containing type is a class or struct:

    A nested type that is declared in a class can have any of the five forms of declared accessibility (public, protected internal, protected, internal, or private) and, like other class members, defaults to private declared accessibility.
    A nested type that is declared in a struct can have any of three forms of declared accessibility (public, internal, or private) and, like other struct members, defaults to private declared accessibility.

    Но игнорировать CLR?
    Тогда как объяснить это:
    Код (Text):
    namespace ConsoleApplication1
    {
    enum SomeEnum
    {
    seNormal,
    seExtend
    }

    public class Class22
    {
    SomeEnum SE;//может я нашел 5-ю famorassem
    }  
    }
     
Загрузка...

Поделиться этой страницей