Я пишу форму в С#, которая должна обращаться ко всем внутренним классам, содержащим структуру. Я получаю сообщение об ошибке:
public frmSelectMusic(int mode, Module.MusicData data)
{
InitializeComponent();
switch (mode)
{
case 1:
this.Text = "BGM";
compileList("BGM");
break;
case 2:
this.Text = "BGS";
compileList("BGS");
break;
case 3:
this.Text = "ME";
compileList("ME");
break;
case 4:
this.Text = "SE";
compileList("SE");
break;
}
this.mode = mode;
if (data.name != "")
{
if (objList.Items.Contains(data.name))
{
objList.SelectedItem = data.name;
cmdVolume.Value = data.volume / 10;
cmdPitch.Value = (data.pitch - 50) / 10;
}
}
}
Это модуль:
internal class Module
{
internal static string mainPath;
internal static string projectPath;
internal struct MusicData
{
public int type;
public string name;
public int volume;
public int pitch;
}
}
Что мне не хватает? Должен ли я использовать public вместо внутреннего модуля?
Ваша структура MusicData
определяется как внутренняя структура Module
внутреннего класса.
Таким образом, вы не можете получить доступ к чему-то общественному, если "путь" к функции блокируется "нижним" модификатором доступа (внутренним).
Модификатор внутреннего доступа в основном предоставляет доступ любому пользователю в той же сборке, в то время как модификатор общедоступного доступа предоставляет доступ всем.
Таким образом, вам нужно либо изменить свои внутренности на общественность, либо изменить общественность на внутреннюю.
Читайте еще несколько здесь.
Module и Module.MusicData являются внутренними, поэтому они видны только с помощью кода внутри одной сборки, а конструктор frmSelectMusic является общедоступным, поэтому его могут видеть все. Этот публичный конструктор (который может быть замечен всеми) принимает в качестве аргумента Module.MusicData структуру, которая не может быть видна всем, есть конфликт. Таким образом, вы должны либо изменить конструктор frmSelectMusic на внутренние, либо на модули Module и Module.MusicData для публики.