为什么我通过其他脚本调用此方法时会收到 NullReferenceException?

Why am I getting NullReferenceException when I call this method through other scripts?

我正在从事这个语音识别和文本到语音的项目。我得到了三个脚本,一个是 Form.cs,另一个是文本到语音的脚本 (Voice.cs),另一个是其他方法的脚本 Auxiliary.csVoice.cs 有变量 SpeechSynthesizer synth = new SpeechSynthesizer(); 正常。

然后我有这个 void:

public void Say(string speech)
{
   synth.SpeakAsync (speech);
}

当我在 Form.cs 脚本中调用 Voice.Say(string) 时它运行良好,当我从 Auxiliary.cs 调用它时它在合成器中抛出 NullReferenceException

为什么会这样?我的意思是,表单脚本以与 Auxiliary.cs

完全相同的方式调用它

抱歉,如果这个问题已经存在,我在整个网站上都进行了搜索,但一无所获。

编辑:这些是代码。

    //Form1.cs
    public partial class Form1 : Form
    {
        public Auxiliary auxiliary;
        public Voice voice;
        public void Form1_Load ()
        {
             voice = new Voice ();
             auxiliary = new Auxiliary();
             voice.Say("Hi, Patrick");
        }
    }

    //Auxiliary.cs
    public class Auxiliary
    {
        public Voice voice;
        public void Start()
        {
            voice = new Voice();
            voice.Say("Hi");
        }
    }

  //Voice.cs
  public class Voice
  {
      public SpeechSynthesizer synth;
      public void Start()
      {
          synth = new SpeechSynthesizer();
      }
      public void Say(string speech)
      {
          synth.SpeakAsync(speech);
      }
  }

向 类 添加具有适当参数的构造函数是一个好习惯。

Using Constructors (C# Programming Guide)

在你的例子中,方法 Voice.Start() 从未被调用,因此存在 synth 对象的 none 个实例。

// Voice.cs
public class Voice
{
    public SpeechSynthesizer synth;

    public Voice()
    {
        Start();
    }

    public void Start()
    {
        synth = new SpeechSynthesizer();
        synth.SetOutputToDefaultAudioDevice();
    }

    public void Say(string speech)
    {
        synth.SpeakAsync(speech);
    }
}