is inaccessible due to its protection level の原因と直し方
privateなメンバーにクラスの外部からアクセスしようとすると出るコンパイルエラーです。
エラーメッセージの読み方
Program.cs(8,36): error CS0122: 'Box.secret' is inaccessible due to its protection level
Program.cs- ファイル名
8- 行番号
36- 列番号 — この位置でコンパイラが解析に失敗しました
CS0122- エラーコード — 検索するとMicrosoftの解説ページが見つかります
'Box.secret' is inaccessible due to its protection level- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 class Box { 2 private int secret = 42; 3 public int visible = 100; 4 } 5 class Program { 6 static void Main(string[] args) { 7 Box b = new Box(); 8 System.Console.WriteLine(b.secret ); ^ 9 } 10 }
Program.cs(8,36): error CS0122: 'Box.secret' is inaccessible due to its protection level
privateなメンバーはそのクラスの内部からしかアクセスできません。外部から使いたいならpublicにするかプロパティ経由にします。
直し方: secret を visible にします。
広告
広告スロット(未設定)
パターン2
1 class Account { 2 private int balance = 500; 3 public string owner = "Alice"; 4 } 5 class Program { 6 static void Main(string[] args) { 7 Account a = new Account(); 8 System.Console.WriteLine(a.balance); ^ 9 } 10 }
Program.cs(8,36): error CS0122: 'Account.balance' is inaccessible due to its protection level
残高のような内部状態は隠蔽し、公開が必要な情報だけpublicにするのが一般的な設計です。
直し方: balance を owner にします。
パターン3
1 class Config { 2 private string key = "secret-key"; 3 public string name = "app"; 4 } 5 class Program { 6 static void Main(string[] args) { 7 Config c = new Config(); 8 System.Console.WriteLine(c.key ); ^ 9 } 10 }
Program.cs(8,36): error CS0122: 'Config.key' is inaccessible due to its protection level
設定値の中でも機密性の高いものはprivateにして、外部から直接読めないようにします。
直し方: key を name にします。
よくある誤解
privateはそのクラスの内部でしか使えません。外部に公開する必要があるものだけをpublicにするのがカプセル化の基本です。
まとめ
is inaccessible due to its protection levelは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。