Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: перечисление - тип поля класса
Форум программистов > Системное программирование > .NET
iv4258
enum SomeEnum
{
  seNormal,
  seExtend
}

public class Class1
{
    public SomeEnum SE;
}

выдаёт ошибку:
Цитата
Error 1 Inconsistent accessibility: field type 'SomeEnum' is less accessible than field 'Class1.SomeEnum'

sad.gif
как тада использовать в качестве поля класса тип перечисление?
sax_ol
Да, такое бывает, подтверждаю, иногда у нас мне показывают такое. Так что информации можно верить.
Electro
Цитата(iv4258 @ 20:03:2008, 15:36 ) *
enum SomeEnum
{
  seNormal,
  seExtend
}

public class Class1
{
    public SomeEnum SE;
}

выдаёт ошибку:

sad.gif
как тада использовать в качестве поля класса тип перечисление?

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

public enum SomeEnum
{
  seNormal,
  seExtend
}

public class Class1
{
    public SomeEnum SE;
}
iv4258
Цитата(Electro @ 20:03:2008, 20:32 ) *
Error 1 Inconsistent accessibility: field type 'SomeEnum' is less accessible than field 'Class1.SomeEnum'
Ну практически по русски написано: Модификатор доступа у поля типа 'SomeEnum' меньше чем у
у поля 'Class1.SomeEnum' поэтому:

laugh.gif я и забыл что по умолчанию декларируемый класс считается internal
Electro
Цитата(iv4258 @ 21:03:2008, 08:02 ) *
laugh.gif я и забыл что по умолчанию декларируемый класс считается internal

Нет.-prіvate
iv4258
Цитата(Electro @ 22:03:2008, 16:28 ) *
Нет.-prіvate

Для класса в С# используется только два ключевых слова для определения об-
ласти видимости: publiс и internal.
Electro
Цитата(iv4258 @ 24:03:2008, 08:37 ) *
Для класса в С# используется только два ключевых слова для определения об-
ласти видимости: publiс и internal.

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

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

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

А ты запусти компилятор и посмотри.
sax_ol
Цитата(iv4258 @ 26:03:2008 - 09:35) *
Речь шла о C#, а не о правилах СLS.

Цитата(MSDN)
The private keyword is a member access modifier. Private access is the least permissive access level. Private members are accessible only within the body of the class or the struct in which they are declared

Как видите ничего запускат ненадо чтобы убедится в том что private к класу применим, но - см. Pasha п. 2.
Pasha
iv4258
Вчитайся в сообщение об ошибке. В нем вообще упоминания про классы нет. А модификатор доступа по умолчанию зависит от места объявления.
А вообще компилятор на слово private ругается, хотя вчера на работе вроде молчал smile.gif Спишем это на вечерние глюки.
Electro
Цитата(Pasha @ 25:03:2008, 21:43 ) *
iv4258, Electro, горячие финские парни.
1. Оба правы: модификатор доступа private для класса в C# - это на самом деле internal. Доказано рефлектором (с)
2. Оба неправы: к классам применимы аж 5 разных модификаторов доступа. Правда, некоторые только к вложенным классам, и protectedinternal посчитан отдельным модификатором.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }

    enum SomeEnum
    {
        seNormal,
        seExtend
    }

    /*public class Class1
    {
        public SomeEnum SE;
    }*/
}

ldasm дает:
.class private auto ansi sealed ConsoleApplication1.SomeEnum
       extends [mscorlib]System.Enum
{
} // end of class ConsoleApplication1.SomeEnum

Даже если явно: internal enum SomeEnum{}. все равно private
Pasha
Electro
Сорри, думал что топик умер.
Вообще-то начальное утверждение было:
Цитата(iv4258 @ 24:03:2008 - 07:37) *
Для класса в С# используется только два ключевых слова для определения области видимости: publiс и internal.
Для не-вложенных классов в C# действительно используются только public и internal.
Код вроде
    class Class1
    {
        internal class Class2
        {
        
        }

        protected class Class3
        {

        }
    }
откомпилиется в
.class auto ansi nested assembly beforefieldinit Class2
.class auto ansi nested family beforefieldinit Class3
но утверждать на основе этого что в C# не бывает protected классов, потому что "на самом деле они - family" как-то странно.
Electro
Цитата(Pasha @ 7:04:2008, 15:22 ) *
Для не-вложенных классов в C# действительно используются только public и internal.

Это значит мой ildasm врет ?
Либо смысла в internal в исх. коде нет ?
Pasha
Цитата(Electro @ 8:04:2008 - 20:19) *
Это значит мой ildasm врет ?
Либо смысла в internal в исх. коде нет ?
Это значит что internal в языке C# соответствует нескольким модификаторам в IL. Я ведь специально слово C# выделил, чтобы показать что имею в виду не assembly в il, а именно internal в вполне конкретном языке. Так что твой ildasm врет - он показывет не модификатор доступа C#, а результат его компиляции - модификатор доступа IL. Об этом еще в 9-й мессаге было подробно расписано.
Electro
Цитата(Pasha @ 9:04:2008, 07:51 ) *
Это значит что internal в языке C# соответствует нескольким модификаторам в IL.

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

        private enum SomeEnum
        {
            seNormal,
            seExtend
        }

        public class Class1
        {
            internal SomeEnum SE;
        }
    }
Pasha
Цитата(Electro @ 10:04:2008 - 21:49) *
Тогда try...
И чем этот код противоречит моему утверждению? Вобще-то как раз и показывает что internal компилируется в разные модификаторы доступа в зависимости от контекста.
Electro
Противоречите в трактовке, а не в контексте.
Какой смыл применять к типу в одной области видимости применять internal?
Поэтому такой тип(если он не вложен) и компилируется в private, в других случ-х
ildasm одназначно проставит: .class auto ansi sealed nested assembly для internal
и .class auto ansi sealed nested private - для private.
sax_ol
Цитата(Electro @ 11:04:2008 - 23:23) *
Какой смыл применять к типу в одной области видимости применять internal?

Тут не понятно.
Pasha
Electro
Да какая разница во что он компилируется. iv4258 говорил о модификаторах доступа в языке C#, а не о том, во что они компилируются. А ты почему-то перескакиваешь на CLR. В C# есть анонимные делегаты и типы - в CLR нет. в C# есть конструкция foreach - в CLR нет. В C# есть модификатор internal - в CLR есть 3 вещи в которые он может скомпилироваться. В C# у невложенных классов по умолчанию C#-й модификатор доступа internal - в CLR он станет private. В C# есть смысл "к типу в одной области видимости применять internal" - есть, потому что internal - это не private и не assembly.
Electro
Цитата(Pasha @ 12:04:2008, 11:11 ) *
Electro
iv4258 говорил о модификаторах доступа в языке C#, а не о том, во что они компилируются.

Если модификатор не указан(для типа или для члена), в C# он считается private, и все.
А intrenal позволяет указать что (тип или член), будет доступен в сборке(assembly), и все.
Во что 3-е intrenal компил-ся я что-то не допонял.
sax_ol
Electro
Что-то я никак не могу понять, про что вы? проигнорируете опять?
Pasha
Цитата(Electro @ 12:04:2008 - 19:45) *
Если модификатор не указан(для типа или для члена), в C# он считается private, и все.
Если модификатор не указан для класса, в C# он считается internal, т.е. он будет доступен в сборке. и все. Хотя бы потому, что в C# не бывает private и protected не-вложенных классов, ни явно, ни по-умолчанию. Открой MSDN, и убедись:
Цитата
The access levels protected and private are only allowed on nested classes.

Цитата(Electro @ 12:04:2008 - 19:45) *
Во что 3-е intrenal компил-ся я что-то не допонял.
В famorassem. Может и 4-е есть, но я не искал.
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?
Тогда как объяснить это:
namespace ConsoleApplication1
{
    enum SomeEnum
    {
        seNormal,
        seExtend
    }

    public class Class22
    {
        SomeEnum SE;//может я нашел 5-ю famorassem
    }    
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.