Inconsistent accessibility parameter type
Несогласованная доступность: тип параметра менее доступен, чем метод
Я пытаюсь передать объект (ссылку на текущего пользователя, в основном) между двумя формами. На данный момент у меня есть что-то вроде этих строк в форме входа:
на следующей форме (клиенты), у меня есть:
. в результате чего я получаю:
Я действительно не понимаю, в чем проблема — оба поля являются частными и доступны соответствующим публичным методом из формы. Гуглить не помогает, поскольку это просто указывает на то, что один элемент является публичным, а другой-частным, что здесь не так.
10 ответов:
строитель public класс clients и public но у него есть параметр типа ACTInterface что это private (он вложен в класс?). Ты не можешь этого сделать. Вам нужно сделать ACTInterface по крайней мере, так же доступны, как clients .
принять открытый класс.
Так что класс должен быть публичным
если звучит как типа ACTInterface не public , но использует доступность по умолчанию либо internal (если это верхний уровень) или private (если он вложен в другой тип).
даешь типа public модификатор исправит это.
другой подход состоит в том, чтобы сделать оба вида и метода internal , если это ваше намерение.
проблема не в доступности поле ( oActInterface ), но скорее типа ACTInterface себя.
какова доступность типа support.ACTInterface . Ошибка предполагает, что он не является публичным.
вы не можете предоставить подпись открытого метода, если некоторые типы параметров подписи не являются открытыми. Невозможно было бы вызвать метод извне, так как вызывающий не мог построить требуемые параметры.
Если вы support.ACTInterface public, который удалит эту ошибку. В качестве альтернативы можно уменьшить доступность метода формы, если это возможно.
проблема, похоже, не с переменной, а с объявлением ACTInterface. Это ACTInterface объявлены как внутренние, случайно?
когда я получил эту ошибку, у меня был класс «helper», который я не объявлял как public, что вызвало эту проблему внутри класса, который использовал класс «helper». Создание класса» helper » public решило эту ошибку, как в:
общественные класс HelperClass <> / / обратите внимание на общедоступный HelperClass, который решил мою проблему.
Это может помочь кому-то еще, кто сталкивается с этот.
Если эта ошибка возникает, когда вы хотите использовать classvariable в новой форме, вы должны поместить определение класса в
вместо имени формы.cs-файл.
после обновления моей модели Entity framework я обнаружил, что эта ошибка заражает несколько файлов в моем решении. Я просто щелкнул правой кнопкой мыши на моем .edmx-файл и мой TT-файл и нажмите «Запустить пользовательский инструмент», и это снова заставило меня вернуться после перезагрузки Visual Studio 2012.
что когда-либо u предоставить класс ActInterface находится под частным классом вот так он получает ошибку
измените этот тип класса на Public ActInterface он разрешит
попробуйте сделать свой конструктор частным, как это:
Inconsistent Accessibility: Parameter type is less accessible than method
Posted by: admin November 14, 2017 Leave a comment
I’m trying to pass an object (a reference to the currently logged on user, basically) between two forms. At the moment, I have something along these lines in the login form:
on the next form (clients), I have:
…which results in me getting:
I don’t really understand what the problem is – both fields are private, and accessed by the relevant public method from the form. Googling doesn’t really help, as it just points towards one element being public and the other private, which isn’t the case here.
Constructor of public class clients is public but it has a parameter of type ACTInterface that is private (it is nested in a class?). You can’t do that. You need to make ACTInterface at least as accessible as clients .
make the class to be public
so the class has to be public
If sounds like the type ACTInterface is not public , but is using the default accessibility of either internal (if it is top-level) or private (if it is nested in another type).
Giving the type the public modifier would fix it.
Another approach is to make both the type and the method internal , if that is your intent.
The issue is not the accessibility of the field ( oActInterface ), but rather of the type ACTInterface itself.
What is the accessibility of the type support.ACTInterface . The error suggests it is not public.
You cannot expose a public method signature where some of the parameter types of the signature are not public. It wouldn’t be possible to call the method from outside since the caller couldn’t construct the parameters required.
If you make support.ACTInterface public that will remove this error. Alternatively reduce the accessibility of the form method if possible.
The problem doesn’t seem to be with the variable but rather with the declaration of ACTInterface. Is ACTInterface declared as internal by any chance?
If this error occurs when you want to use a classvariable in a new form, you should put the class definition in the
instead of the Formname.cs file.
After updating my entity framework model, I found this error infecting several files in my solution. I simply right clicked on my .edmx file and my TT file and click “Run Custom Tool” and that had me right again after a restart of Visual Studio 2012.
what ever u provide class ActInterface is under private class thats way it is getting error
change that class type to Public ActInterface it will resolve
Related Posts
Open raw image of a computer (created with FTK Imager) using C# WPF
Questions: Closed. This question needs to be more focused. It is not currently accepting answers. Want to improve this question? Update the question so it focuses on one problem only by editing this p.
.net – How to correctly read the method signature of the .Any function in C#
Questions: I really enjoy using the aggregate functions that C# provides such as .Any(), but I struggle to understand what my options are just looking from the method signature: Can someone help me be.
c# – i need help to upload a image in datagridview
Questions: I want to upload an image that exists on the database but I did not find the solution of this error enter image description here enter image description here How to&Answers: More Answer.
Введение в ООП с примерами на C#. Часть пятая. Всё о модификаторах доступа
- Переводы, 22 августа 2016 в 21:08
В прошлых статьях серии “Введение в ООП” мы рассматривали полиморфизм (а также нюансы использования его на практике), наследование и абстрактные классы. В этой части я постараюсь раскрыть все тонкости использования модификаторов доступа, которые знаю сам. Продолжаем погружаться в ООП!
Что такое модификаторы доступа?
Давайте в этот раз возьмём определение из Википедии (в русской Википедии статьи access modifiers нет, поэтому здесь приводим свой перевод — прим. перев.) :
Модификаторы доступа (или спецификаторы доступа) — ключевые слова в объектно-ориентированных языках, которые задают (внезапно!) параметры доступа для классов, методов и прочих элементов. Модификаторы доступа — специфичная часть языков программирования для облегчения инкапсуляции компонентов.
Модификаторы public, private, protected
Каждый раз, когда мы создаём класс, мы хотим иметь возможность определять, кто и откуда может взаимодействовать с его членами. Иными словами, нам иногда нужно ограничивать доступ к некоторым членам класса. Есть одно простое правило — члены одного класса всегда имеют доступ друг к другу. Если же говорить про доступ извне, то стоит запомнить, что модификатор доступа по умолчанию – private , т.е. все члены класса доступны только изнутри него самого.
Традиционно сразу переходим к практике. Давайте попробуем выполнить следующий код:
Результатом выполнения этого кода будет:
Modifiers BBB
Modifiers AAA
BBB() отмечен как public , соответственно его можно вызывать откуда угодно. Метод AAA() же никак не отмечен, значит, он является приватным. Однако для члена того же класса (ведь AAA() и BBB() принадлежат одному классу, верно?) это не имеет никакого значения.
Теперь попробуем получить доступ к AAA() напрямую:
‘AccessModifiers.Modifiers.AAA()’ is inaccessible due to its protection level
Для внешних вызовов модификатор private — непреодолимая преграда. То же самое можно сказать и о модификаторе protected .
Модификаторы доступа и наследование
Снова попробуем выполнить код:
Запускаем код и видим…
‘AccessModifiers.ModifiersBase.AAA()’ is inaccessible due to its protection level
Приватные члены недоступны даже дочерним классам. Публичные члены доступны всем, это понятно. Модификатор же protected по сути и обозначает, что член доступен только дочерним классам — вызов CCC() в примере выше не вызывает никаких ошибок.
Модификатор Internal для классов
Давайте рассмотрим следующий сценарий: мы создаём в новой библиотеке классов (назовём её AccessModifiersLibrary ) класс ClassA и помечаем его как internal :
Теперь в созданном ранее файле попробуем выполнить:
Compile time error: ‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
Мы встретили эту ошибку из-за спецификатора доступа internal , который обозначает, что ClassA доступен только внутри AccessModifiersLibrary и ниоткуда больше. Впрочем, если мы уберём этот модификатор, ничего не изменится — internal является спецификатором по умолчанию.
Модификаторы для пространств имён
Давайте попробуем сделать с предыдущим кодом следующее:
Конечно, это не скомпилируется:
Compile time error: A namespace declaration cannot have modifiers or attributes
Все пространства имён по умолчанию являются публичными, и мы не можем добавить к их объявлению никаких модификаторов, включая ещё один public .
Приватные классы
Если мы попробуем скомпилировать код, приведённый выше, то получим ошибку:
Compile time error: Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal
Всё правильно: классы могут быть либо public , либо internal .
Подробнее о модификаторах членов класса
Что будет, если мы захотим назначить члену класса больше одного модификатора доступа?
Будет ошибка компиляции:
Compile time error: More than one protection modifier
А как поведёт себя язык, если мы создадим public метод в internal классе?
Вывод после компиляции:
‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
The type ‘AccessModifiersLibrary.ClassA’ has no constructors defined
‘AccessModifiersLibrary.ClassA’ is inaccessible due to its protection level
‘AccessModifiersLibrary.ClassA’ does not contain a definition for ‘MethodClassA’ and
no extension method ‘MethodClassA’ accepting a first argument of type ‘AccessModifiersLibrary.ClassA’
could be found (are you missing a using directive or an assembly reference?)
Как много ошибок… Дело в том, что какими бы модификаторами не обладали члены internal класса, их всё равно нельзя вызвать оттуда, где не виден сам класс. А что будет, если мы попробуем сделать наоборот — вызвать private или internal метод у public класса?
‘AccessModifiersLibrary.ClassA’ does not contain a definition
for ‘MethodClassA’ and no extension method ‘MethodClassA’ accepting a first argument
of type ‘AccessModifiersLibrary.ClassA’ could be found (are you missing a using directive or an assembly reference?)
Не-а, всё равно не работает. А если изменим модификатор метода на internal ?
‘AccessModifiersLibrary.ClassA’ does not contain a definition for ‘MethodClassA’ and no extension
method ‘MethodClassA’ accepting a first argument of type ‘AccessModifiersLibrary.ClassA’ could be
found (are you missing a using directive or an assembly reference?)
Увы, так делать тоже нельзя.
Модификатор protected internal
Этот код компилируется без ошибок. Модификатор internal proteted (как не слишком сложно догадаться) даёт понять, что метод доступен как для вызовов из того же файла, в котором он объявлен, так и для вызовов из дочерних классов.
Protected поля
Здесь всё будет немного сложнее. Давайте напишем следующий код:
Если мы его запустим, то получим ошибку:
Cannot access protected member ‘AccessModifiers.AAA.a’ via a qualifier of type ‘AccessModifiers.AAA’;
the qualifier must be of type ‘AccessModifiers.BBB’ (or derived from it)
Совершенно неочевидно, правда? Компилятор ругается на строчку aaa.a = 100 из метода MethodBBB . Почему никаких ошибок не вызывает метод MethodAAA понять достаточно просто — поле a объявлено в том же файле, в том же классе, в котором к нему и происходит обращение, это не может быть ошибкой. Почему в классе BBB доступен член bbb.a тоже понятно — модификатор protected прямо разрешает использовать члены родительского класса в дочернем как свои. Почему же вызов aaa.a = 100 из метода MethodBBB под запретом? Пожалуй, это стоит просто запомнить.
6 – 17 апреля , онлайн, беcплатно
(От редакции) Скорее всего, это сделано, чтобы нельзя было делать следующим образом:
Приоритет модификаторов
Compile time error: Inconsistent accessibility: base class ‘AccessModifiers.AAA’ is less accessible than class ‘AccessModifiers.BBB’
К дочернему классу не может быть большего доступа, чем к родительскому. Как вы понимаете, public предоставляет гораздо больший доступ, чем модификатор по умолчанию internal . Причём нельзя делать даже так:
Inconsistent accessibility: return type ‘AccessModifiers.AAA’ is less accessible than method ‘AccessModifiers.BBB.MethodB()’
Inconsistent accessibility: field type ‘AccessModifiers.AAA’ is less accessible than field ‘AccessModifiers.BBB.aaa’
Подведём итоги:
- Модификатор доступа по умолчанию для членов класса — private ;
- Модификатор доступа internal значит, что доступ разрешён только из того же файла;
- У пространств имён нет и не может быть модификаторов доступа (можно считать, что они все public );
- Классы могут иметь только два модификатора доступа — internal (по умолчанию) и public
- Модификатор protected internal значит, что доступ есть как из того же файла, так и из дочерних классов
- Родительский класс не может быть менее доступен, чем дочерний
- Возвращаемое значение метода не может быть менее доступно, чем сам метод
- Поле не может быть более доступно, чем его тип
Работу с константами и sealed классами (которая тоже осуществляется за счёт модификаторов доступа) мы разберём в следующей статье.
Inconsistent accessibility parameter type
class MemberProfile : IMemberProfile
public string FirstName
public string LastName
public string Email
public System. Guid MemberID
if (m_uniqueID.CompareTo( null ) == 0)
m_uniqueID = System. Guid .NewGuid();
Answers
I think you’ll also need to declare the interface IMemberProfile as public. The root of the issue is that without the public modifier, IMemberProfile becomes internal to the assembly it’s defined in. However, the function that takes it as a parameter is public. If a function’s parameter type can’t be seen by those who might call it from outside the assembly, then the function can’t be called (and isn’t truly public).
Hope that helps.
All replies
class MemberProfile : IMemberProfile
public class MemberProfile : IMemberProfile
thank you gaetan. I made that change to declare MemberProfile as a public access modifier and the error still exists.
thank you H. Tony. I made that change to declare MemberProfile as a public access modifier and the error still exists.
Anything else it could be?
I think you’ll also need to declare the interface IMemberProfile as public. The root of the issue is that without the public modifier, IMemberProfile becomes internal to the assembly it’s defined in. However, the function that takes it as a parameter is public. If a function’s parameter type can’t be seen by those who might call it from outside the assembly, then the function can’t be called (and isn’t truly public).
Hope that helps.
You were all right. and thanks Nick.. of course the contract which the interface is would have to match the class’s access modidifier that implements the contract. Is the default private?
The default is «internal,» which means that the type is accessible from other types within the same assembly (for the most part, this means the same DLL or executable).
I think it’s good practice to always specify an access specifier. Unfortunately, I think Visual Studio doesn’t explicitly include one when you use its wizards, so any new types you create that way will be internal by default.
Thanks alot.. Ur post help me.
Interfaces declared directly within a namespace can be declared as public or internal and, just like classes and structs, interfaces default to internal access. Interface members are always public because the purpose of an interface is to enable other types to access a class or struct.
I created one connected webpart , Created one interface using in Provider webpart , defined some variable in it , and using in Provider webpart , Created one function which is returning the value to consumer webpart , consumer webpart has function which consuming the value using interface object as parameter.
But I didn’t change the Access Modifier for Interface , then am getting the similar error of » Inconsistent accessibility» , For that I changed the Interface Access modifier to Public , then both webpart accessing the value of interface
Почему не «inconsistent accessibility» использовать частный вложенный тип внутри универсального типа в списке интерфейсов?
В случае, если название не совсем понятно, вот код, который меня озадачивает:
Я удивлен, что это компилируется без ошибок. Такое чувство, что я выставляю тип private . Разве это не должно быть незаконно?
Может быть, ваши ответы будут просто «нет никакого правила против этого, так почему бы не быть OK?- Возможно, не менее удивительно и то, что MyClass.NestedInMyClass находится даже в «scope». Если я удалю квалификацию MyClass. , она не будет компилироваться.
(Если я изменяю IFoo<> в универсальный класс , который затем должен стать базовым классом MyClass , это незаконно, поскольку базовый тип должен быть по крайней мере таким же доступным, как и сам тип.)
Я попробовал это с компилятором C# 4 Visual Studio 2010.
2 Ответа
Никакой внешний код не может привести объект к этому интерфейсу, поэтому это не проблема доступности.
Классы public даже могут реализовывать интерфейсы private или internal -и точно так же никакое приведение не может фактически произойти из внешнего кода.
Re: обсуждение реализаций, которые зависят от T — вам это будет разрешено, если вы используете явную реализацию интерфейса-потому что методы для интерфейса в этом случае являются фактически частными. E.g.:
работает (потому что метод реализации интерфейса не предоставляется самим классом).
Тот факт, что класс реализует интерфейс, означает, что код, который может создать место хранения типа интерфейса, может хранить ссылку на этот тип в этом месте хранения и может использовать элементы интерфейса в этом месте хранения. Это не дает никакой новой возможности для кода, который в противном случае не имел бы возможности создать место хранения этого типа.
Наличие открытого класса Foo реализовать интерфейс частного или внутреннего типа IBar позволяет коду, который имеет доступ к IBar для приведения Foo ссылки на IBar . Тот факт, что Foo доступен для кода, который не имеет доступа к IBar , никоим образом не означает, что он также не будет использоваться кодом, который имеет такой доступ. Действительно, было бы вполне нормально, что assembly или класс, в котором определен Foo , захотел бы использовать функции Foo , которые недоступны внешнему миру; тот факт, что он реализует IBar , был бы просто одним из таких функций.
Похожие вопросы:
Есть ли способ отразить на интерфейсе, чтобы обнаружить отклонение от его параметров универсального типа и возвращаемых типов? Другими словами, можно ли использовать отражение для различения двух.
У меня есть класс C#, который определяет несколько псевдонимов с ключевым словом using для некоторых публичных свойств. Это приводит к ошибкам компилятора inconsistent accessibility, поскольку.
Как я могу правильно наследовать класс (другого класса и интерфейсов), который имеет универсальный тип с ограничением универсального типа (где)? class A < >class B < >interface I < >class.
Я хочу создать базовую сущность, которую можно использовать с несколькими системами доступа к данным. Аргумент универсального типа представляет тип свойства. public interface IEntity <.
Мне нужен какой-то способ определить псевдоним типа внутри класса, используя его параметры типа class ToMap[Key, Value] < type MapType = Map[Key, Value] >val z: ToMap[Int, Int].MapType = Map((1.
Считать это: [SomeAttr(typeof(Bar))] class Foo < class Bar < >> . а это: class Foo : ISomething < class Bar < >> Первый пример компилируется, второй-нет. чтобы использовать ссылку на.
Я пытаюсь следовать образцу ReactiveUI.Cinephile , используя ContentPageBase . Но когда я расширяю его на свой взгляд, я получаю эту ошибку: Inconsistent accessibility: base class.
Класс товара public class Item < public bool Check(int value) < . >> Базовый абстрактный класс с ограничением универсального типа public abstract class ClassBase where TItem : Item <.
В дженерики FAQ: лучшие практики говорит : Компилятор позволит вам явно привести параметры универсального типа к любому интерфейсу, но не к классу: interface ISomeInterface <. >class SomeClass.
Возможные Дубликаты : Почему isn’t существует общая дисперсия для классов в C# 4.0? Почему C# (4.0) не допускает Ко — и контравариантность в универсальных типах классов? Новая Ко — и.