Compiler error cs0122

This repository contains .NET Documentation. Contribute to dotnet/docs development by creating an account on GitHub.

Permalink

Cannot retrieve contributors at this time

description title ms.date f1_keywords helpviewer_keywords ms.assetid

Compiler Error CS0122

Compiler Error CS0122

07/20/2015

CS0122

CS0122

5f639a66-c807-4166-b88a-93e5f272ceb7

Compiler Error CS0122

‘member’ is inaccessible due to its protection level

The access modifier for a class member prevents accessing the member. For more information, see Access Modifiers.

One cause of this (not shown in the sample below) can be omitting the /out compiler flag on the target of a friend assembly. For more information, see Friend Assemblies and OutputAssembly (C# Compiler Options).

Example

The following sample generates CS0122:

// CS0122.cs
public class MyClass
{
    // Make public to resolve CS0122.
    void MyMethod()
    {
    }
}

public class MyClass2
{
    public static int Main()
    {  
        var a = new MyClass();  
        // MyMethod is private.
        a.MyMethod();   // CS0122
        return 0;
   }
}

I am trying to get to grips with NUnit — i have installed it and run it successfully within one project. I want to keep productioncode seperate from testcode, so i write tests in a different project. The Test Project Links to the original project. (IDE C# Express 2010)

My Testcode looks like this:

using NUnit.Framework;

namespace test.Import
{
    [TestFixture]
    class XMLOpenTest
    {
        [Test]
        public void openNotAPath(){
            try
            {
                production.Import.XMLHandler.open("Not A Path");
            }
            catch
            {
                Assert.Fail("File Open Fail");
            }
        }
    }
}

I know i could resolve this by making the production.Import.XMLHandler Class public, but i dont want to change my productioncode to allow this kind of testing.

How do i get around this? Can i make changes to my testcode? Are there other good ways to seperate test and production code in two projects? Are there ressources for dummys on the internet?

C# Compiler Error

CS0122 – ‘member’ is inaccessible due to its protection level

Reason for the Error

You will usually receive this error when you are trying to access a member of a class (Eg : Method) when the member’s access modifier prevents you from accessing it.

For example, compile the below code snippet.

namespace DeveloperPublishNamespace
{
    public class Class1
    {
        void Method1()
        {
        }
    }

    public class DeveloperPublish
    {         
        public static void Main()
        {
            Class1 obj1 = new Class1();
            // Compiler Error
            obj1.Method1();
        }
    }
}

The C# compiler will result with the below C# compiler error as the Method1 by default has the private access modifier which cannot be accessed directly.

Error CS0122 ‘Class1.Method1()’ is inaccessible due to its protection level ConsoleApp1 C:UsersSenthilsourcereposConsoleApp1ConsoleApp1Program.cs 16 Active

C# Error CS0122 – 'member' is inaccessible due to its protection level

Solution

You can avoid this error by changing the access modifier of the Method to allow its access (if needed).

Содержание

  1. CS0122: ‘System.Configuration.StringUtil’ is inaccessible due to its protection level
  2. 6 Answers 6
  3. is inaccessible due to its protection level
  4. 9 Answers 9
  5. Linked
  6. Related
  7. Hot Network Questions
  8. Subscribe to RSS
  9. CS0122 wrong member inaccessible when overload does not exist #15401
  10. Comments
  11. Footer
  12. How can i fix ‘Settings’ is inaccessible due to its protection level error?
  13. 2 Answers 2
  14. Related
  15. Hot Network Questions
  16. Subscribe to RSS
  17. error CS0122: ‘ThisAssembly’ is inaccessible due to its protection level #449
  18. Comments

CS0122: ‘System.Configuration.StringUtil’ is inaccessible due to its protection level

i am currently doing a school project whereby i can allow students and teachers to search for intership jobs.

I am trying to get to the ASP.Net Configuration to add users and roles but i got this error.

Server Error in ‘/asp.netwebadminfiles’ Application.

Compilation Error Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS0122: ‘System.Configuration.StringUtil’ is inaccessible due to its protection level

Source File: c:WindowsMicrosoft.NETFramework64v4.0.30319ASP.NETWebAdminFilesApp_CodeWebAdminPage.cs Line: 989

Is there anyway i can fix this or do i have to redo my whole project?(hopefully not because theres alot of work done.)

I’m quite a newbie at troubleshooting so step by step guides will be greatly appreciated. thanks!

6 Answers 6

Open the ASP.NETWebAdminFiles website using any Visual Studio

Inside your wesbite project, browse to the C# file

Go to Line 989

Comment the line out // string appId = StringUtil.GetNonRandomizedHashCode.

Add a new line string appId = «1»

Save the website, Unload it from Visual Studio

Run IIS Express in CMD

Run your website

In Visual Studio

File — Open — Website

Now open App_CodeWebAdminPage.cs

Comment out the current text and paste

The problem occurs if you installed the .NET Framework 4.6. This is fixed in 4.6.1, so just downloading it (or a later version) solves the issue. No code changes necessary.

check your targeted framework if it is 4.0 then change to 3.5 and build the project and open asp.net configuration it is work for me

StringUtil is a (static) class in your project. This class is most likely defined as:

This means that your WebAdminPage can’t see it, because it is private . This will cause the error you see. Change it to:

Now any class can use it at any time.

Read more about protection levels in Microsoft’s documentation:

After looking at the error code again I see that the namespace for StringUtil is System.Configuration.StringUtil , which means that this is a system class and not a class in your project. According to Microsoft’s source code this class is defined as static internal class StringUtil . Following the previous link about protection levels we can see that:

Internal: Access is limited to the current assembly

Which means that the StringUtil class can only be used from the assembly (DLL file) it is confined in. Seeing as you can’t add your own code to Microsoft’s system DLLs, you can’t use this method (As Microsoft has added it for their own internal use).

Источник

is inaccessible due to its protection level

I can’t figure this out. The problem is that the distance, club, cleanclub, hole, scores and par all say inaccessible due to protection level and I don’t know why because I thought I did everything right.

this is the derived class:

This is the interface:

here is the main code:

9 Answers 9

In your base class Clubs the following are declared protected

which means these can only be accessed by the class itself or any class which derives from Clubs .

In your main code, you try to access these outside of the class itself. eg:

You have (somewhat correctly) provided public accessors to these variables. eg:

which means your main code could be changed to

Dan, it’s just you’re accessing the protected field instead of properties.

See for example this line in your Main(. ) :

myClub.distance is the protected field, while you wanted to set the property mydistance.

I’m just giving you some hint, I’m not going to correct your code, since this is homework! 😉

use your public properties that you have defined for others as well instead of the protected field members.

In your Main method, you’re trying to access, for instance, club (which is protected), when you should be accessing myclub which is the public property that you created.

You organized class interface such that public members begin with «my». Therefore you must use only those members. Instead of

you should write

It’s because you cannot access protected member data through its class instance. You should correct your code as follows:

You need to use the public properties from Main , and not try to directly change the internal variables.

The reason being you cannot access protected member data through the instance of the class.

Reason why it is not allowed is explained in this blog.

Though it is irrelevant to the case at hand, for the benefit of the next person who arrives at this article through a search engine, if the default constructor of your base class is marked as private, derived classes will incur a CS0122 diagnostic.

Instead, you must promote the private method to protected.

The protected method remains inaccessible to consumers of the derived class unless said class overrides it with a new constructor.

Linked

Hot Network Questions

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.1.14.43159

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

CS0122 wrong member inaccessible when overload does not exist #15401

Version Used: 2.0.0.61104

Steps to Reproduce:

.NET CS1061 ‘TcpClient’ does not contain a definition for ‘Dispose’ .

Actual Behavior: CS0122 ‘TcpClient.Dispose(bool)’ is inaccessible due to its protection level

This happens for example when downgrading project from 4.6 (which has TcpClient.Dispose method) to 4.5.

The text was updated successfully, but these errors were encountered:

Could you explain why do you think that error would be better? Especially considering that the error message would be technically wrong (since TcpClient does contain a definition for Dispose ).

since TcpClient does contain a definition for Dispose

No it does not in 4.5, that is the point (and reason for the error in the first place).

The actual error CS0122 is very confusing because it tells you that Dispose(bool) is inaccessible but you are not calling Disposible(bool) anywhere. So it’s like . well, that’s true I guess.. so what?

The way I see it, the compiler does this:

  1. Find out if there are any methods called Dispose .
  2. Find out if any of them are accessible.
  3. Find out which one to call, based on overload resolution rules.

In this case, step 1 succeeds (it finds protected void Dispose(bool) ), step 2 fails (because it’s protected ) and so that is the error that is reported.

Step 3 is never reached, so the compiler does not get a chance to figure out that protected void Dispose(bool) is not applicable also because it expects a parameter.

Though just because it follows the logic of the compiler (or the specification) does not necessarily mean it’s a good error message. But I think in this case it is, it’s better if the compiler tells you why the Dispose method it found couldn’t be used, than if it pretended there is no Dispose method.

Put another way, protected void Dispose(bool) is wrong for two reasons (accessibility and expecting parameter), and I would expect the compiler to report one of them, which is what it does.

Hmm I see your point. You are also implying that the overload resolution happens only on accessible methods, I guess for performance reasons. The fact that it does not report the called overload even if it does exist makes it even more confusing:

Maybe the error could somehow reflect the facts you described?

The same way you could argue that No overload for method ‘Method’ takes 2 arguments. (should the first one be public) is technically wrong and it should be No *accessible* overload for method ‘Method’ takes 2 arguments. instead.

Maybe the error could somehow reflect the facts you described?

Yeah, if that error message actually means «there is no accessible overload», as I think it does, then I would prefer if it didn’t specify an overload. I.e. change:

CS0122 ‘Test.Method(bool)’ is inaccessible due to its protection level

CS0122 ‘Test.Method’ is inaccessible due to its protection level

An improved error message here would be desirable. However, it’s still important that hte compiler under the covers bind to these members and expose them through the API.

THis is, for example, how Roslyn can ensure that things like goto-def work across langauge from VB to C# (and vice versa). If you have a VB class where you define private Dispose(bool) and you then reference that from C# as «Dispose», we want to get the message that you messed things up, and we want to be able to allow you to goto-def to get to that symbol, as well as provide suitable ‘fixes’ (in the future at least) for things like changing the accessibility and whatnot.

© 2023 GitHub, Inc.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

How can i fix ‘Settings’ is inaccessible due to its protection level error?

Severity Code Description Project File Line Suppression State Error CS0122 ‘Settings’ is inaccessible due to its protection level

The error is on the line: On the Settings

And the Settings definition

2 Answers 2

Class marked as internal is accessible only inside assembly it is declared.

There are two possible solutions:

You should make it public :

OR

[Possible solution, but first is better]

If you don’t want to make it public you can set friend assembly . Friend assembly can access to internal types in other assembly:

Put this line in file with your Settings after using directives:

Just to make the answer of Roma Doskoch more clear: if you do want to make your settings public make sure to set this in the designer: unless you do this, at every time that you will save the settings from the designer the public will be overwritten.

if you do not want to make the setting public, put the code mentioned in the file «AssemblyInfo.cs» in the properties folder

Hot Network Questions

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.1.14.43159

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

error CS0122: ‘ThisAssembly’ is inaccessible due to its protection level #449

Hi there I’m on a project that uses Nerdbank.GitVersioning 3.1.68. After a number of changes updating our WPF project to .NET Core 3.1 at some point we started to see the follow error.

error CS0122: ‘ThisAssembly’ is inaccessible due to its protection level

To be clear this had been working. But at some point we changed our project SDK from «MSBuild.SDK.Extras» to «Microsoft.NET.Sdk.WindowsDesktop».

Of course this is because we use some of the properties from the ThisAssembly class in our code. After a number of attempts to determine the cause I finally tried defining ThisAssembly in our code as seen below.

internal static partial class ThisAssembly

This changed all the errors all to something along the lines of the error below.

error CS0117: ‘ThisAssembly’ does not contain a definition for ‘AssemblyVersion’

I only found a couple references to the first error online but they seemed to work around the issue by disabling GitVersioning and one eluded to the timing of when ThisAssembly is created. That would certainly explain the two different errors and the fact that I see the errors in VS after building but they very quickly disappear in the Error List panel when I navigate to the files with the errors. However, they can always be found in the build logs.

Use of GitVersioning is seems pretty straight forward and the only significant csproj file change was the SDK change. All other changes were code so I doubt they could affect this.

The text was updated successfully, but these errors were encountered:

Источник

AlinDen

0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

1

15.02.2021, 14:29. Показов 4939. Ответов 10

Метки нет (Все метки)


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private void историяToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form2 History = new Form2();
            History.Show();
            if (ctl.his.Записей() == 0)
            {
                History.textBox1.AppendText("История пуста");
                return;
            }
            //Ообразить историю. 
            for (int i = 0; i < ctl.his.Записей(); i++)
            {
                History.textBox1.AppendText(ctl.his[i].ToString());
            }
        }

Класс History.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Control
{
    public struct Record
    {
        public int p1;
        public int p2;
        public string number1;
        public string number2;
    }
 
    public class History
    {
        private static object textBox1;
        List<Record> L = new List<Record>();
        public Record this[int i]
        {
            get { return L[i]; }
        }
 
        internal static object TextBox1 { get => textBox1; set => textBox1 = value; }
 
        public void AddRecord(int p10, int p20, string n1, string n2)
        {
            L.Add(new Record() { p1 = p10, p2 = p20, number1 = n1, number2 = n2 });
        }
        public void Clear()
        {
            L.Clear();
        }
        public int Count()
        {
            return L.Count();
        }
 
        internal int Записей()
        {
            throw new NotImplementedException();
        }
    }
}

Миниатюры

Ошибка CS0122 'Form2.textBox1" недоступен из-за его уровня защиты. (Компилятор Visual Studio 2017)
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



454 / 278 / 163

Регистрация: 17.04.2019

Сообщений: 1,603

15.02.2021, 14:35

2

AlinDen, в 19 строке textBox1 имеет модификатор доступа private, поэтому вы и получаете такую ошибку.



0



Эксперт .NET

6269 / 3897 / 1567

Регистрация: 09.05.2015

Сообщений: 9,188

15.02.2021, 14:41

3

А еще не понятно зачем там вообще TextBox, имеющий тип object, если он нигде не создаётся и не отображается…



0



0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

15.02.2021, 17:00

 [ТС]

4

Я убрал private но ошибки есть!

Миниатюры

Ошибка CS0122 'Form2.textBox1" недоступен из-за его уровня защиты. (Компилятор Visual Studio 2017)
 



0



Эксперт .NET

6269 / 3897 / 1567

Регистрация: 09.05.2015

Сообщений: 9,188

15.02.2021, 17:02

5

Цитата
Сообщение от AlinDen
Посмотреть сообщение

Я убрал private но ошибки есть!

Ошибки в совершенно другом месте…



0



0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

15.02.2021, 17:18

 [ТС]

6

Ошибка!

Миниатюры

Ошибка CS0122 'Form2.textBox1" недоступен из-за его уровня защиты. (Компилятор Visual Studio 2017)
 



0



Эксперт .NET

6269 / 3897 / 1567

Регистрация: 09.05.2015

Сообщений: 9,188

15.02.2021, 17:21

7

Цитата
Сообщение от AlinDen
Посмотреть сообщение

Ошибка!

Не тут она…



0



454 / 278 / 163

Регистрация: 17.04.2019

Сообщений: 1,603

15.02.2021, 17:22

8

AlinDen, если хотите использовать статическое поле из другого класса, то установите ему модификатор public. Но так лучше не делать, конечно. Вы свалили всё в кучу: и логику, и представление данных.



0



AlinDen

0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

15.02.2021, 17:53

 [ТС]

9

Во-так написать public object textBox1?
Но тогда будет ошибка CS0120!

Добавлено через 23 минуты
Так кто что посоветует?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        private void историяToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form2 History = new Form2();
            History.Show();
            if (ctl.his.Записей() == 0)
            {
                History.textBox1.AppendText("История пуста");
                return;
            }
            //Ообразить историю. 
            for (int i = 0; i < ctl.his.Записей(); i++)
            {
                History.textBox1.AppendText(ctl.his[i].ToString());
            }
        }

Класс истории

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
 
namespace Control
{
    public struct Record
    {
        public int p1;
        public int p2;
        public string number1;
        public string number2;
    }
 
    public class History
    {
        static object textBox1;
        List<Record> L = new List<Record>();
        public Record this[int i]
        {
            get { return L[i]; }
        }
 
        internal static object TextBox1 { get => textBox1; set => textBox1 = value; }
 
        public void AddRecord(int p10, int p20, string n1, string n2)
        {
            L.Add(new Record() { p1 = p10, p2 = p20, number1 = n1, number2 = n2 });
        }
        public void Clear()
        {
            L.Clear();
        }
        public int Count()
        {
            return L.Count();
        }
 
        internal int Записей()
        {
            throw new NotImplementedException();
        }
    }
}



0



0 / 0 / 0

Регистрация: 05.05.2019

Сообщений: 74

16.02.2021, 06:12

 [ТС]

10

Но модификатор public не помог

Миниатюры

Ошибка CS0122 'Form2.textBox1" недоступен из-за его уровня защиты. (Компилятор Visual Studio 2017)
 



0



Элд Хасп

Модератор

Эксперт .NET

13302 / 9586 / 2574

Регистрация: 21.04.2018

Сообщений: 28,282

Записей в блоге: 2

16.02.2021, 10:21

11

Цитата
Сообщение от AlinDen
Посмотреть сообщение

Но модификатор public не помог

Я бы посоветовал изменить изменить подход к реализации.

Что вам нужно от второй Формы?
Только отображение какого-то текста.
Так зачем делать публичным ВЕСЬ КОНТРОЛ?

Добавьте свойство в Форму и обращайтесь к нему.

Демо-код:

C#
1
2
3
4
5
6
7
8
9
10
11
    public class Form2 : Form
    {
        public string Message
        {
             get => textBox1.Text;
             set => textBox1.Text = value;
        }
 
         --------------
         --------------
     }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private void историяToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form2 History = new Form2();
            // History.Show();
            if (ctl.his.Записей() == 0)
            {
                History.Message = "История пуста";
            //    return;
            }
            //Ообразить историю. 
           // for (int i = 0; i < ctl.his.Записей(); i++)
           // {
           //     History.textBox1.AppendText(ctl.his[i].ToString());
           // }
            else
               History.Message = string.Join("rn", ctl.his);
 
            History.Show();
        }



0



Понравилась статья? Поделить с друзьями:
  • Compiler error cs0030
  • Compiler error cs0029
  • Compiler error cs0019
  • Compiler error c2360
  • Compiler debug log error unable to generate contract bytecode and abilities