• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы iv4258
  • Дата начала
I

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'
:)
как тада использовать в качестве поля класса тип перечисление?
 
E

Electro

Код:
enum SomeEnum
{
seNormal,
seExtend
}

public class Class1
{
public SomeEnum SE;
}
выдаёт ошибку:

:huh:
как тада использовать в качестве поля класса тип перечисление?
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;
}
 
I

iv4258

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

Pasha

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

iv4258

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

Ого, это ты где-то вычитал или сам придумал?
А ты запусти компилятор и посмотри.
 
P

Pasha

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

Electro

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
 
P

Pasha

Electro
Сорри, думал что топик умер.
Вообще-то начальное утверждение было:
Для класса в С# используется только два ключевых слова для определения области видимости: 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" как-то странно.
 
P

Pasha

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

Electro

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

Pasha

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

Electro

Electro
iv4258 говорил о модификаторах доступа в языке C#, а не о том, во что они компилируются.
Если модификатор не указан(для типа или для члена), в C# он считается private, и все.
А intrenal позволяет указать что (тип или член), будет доступен в сборке(assembly), и все.
Во что 3-е intrenal компил-ся я что-то не допонял.
 
P

Pasha

Если модификатор не указан(для типа или для члена), в C# он считается private, и все.
Если модификатор не указан для класса, в C# он считается internal, т.е. он будет доступен в сборке. и все. Хотя бы потому, что в C# не бывает private и protected не-вложенных классов, ни явно, ни по-умолчанию. Открой MSDN, и убедись:
The access levels protected and private are only allowed on nested classes.
Во что 3-е intrenal компил-ся я что-то не допонял.
В famorassem. Может и 4-е есть, но я не искал.
 
E

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
}	
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!