【问题标题】:C# calling a method from inner class that has reference to outerclassC# 从引用了外部类的内部类调用方法
【发布时间】:2014-08-28 17:54:00
【问题描述】:

我有一个名为 Foo 的类,它有一个内部类 Inner。内部类引用了外部类的字段。

public class Foo
{
    int foo = 2;

    public class Inner
    {
        Foo f;
        public Inner(Foo f)
        {
            f=f;
        }

        public override String ToString()
        {
            return "Inner[foo="+f.foo+"]" ;
        }
    }
}

这是我的程序。

public class Program
{
   public static void Main(string[] args)
   {    
      Foo foo=new Foo();
      Foo.Inner inner=new Foo.Inner(foo);
      Console.WriteLine(inner.ToString());
   }
}

编译没有问题,但是运行失败。 它给了我一个例外

未处理的异常:System.NullReferenceException:对象引用 未设置为对象的实例。在 Foo.Inner.ToString()

这是怎么回事?

【问题讨论】:

标签: c#


【解决方案1】:

问题:
您的问题在于f = f。它没有做任何有成效的事情。此行不会更新Inner 字段f 并且它保持未分配或null。因此,当您执行Console.WriteLine(inner.ToString()); 时,它会在"Inner[foo=" + f.foo + "]" 处引发错误

VS 也会显示警告

解决方案:
1.将构造函数变量更改为其他内容。像这样

Foo f;
public Inner(Foo f1)
{
    f = f1;
}



2。添加this 以区分变量。

Foo f;
public Inner(Foo f)
{
    this.f = f;
}

【讨论】:

  • 我想知道“发布”编译是否会切断整个操作,避免异常......一个很好的测试!
  • @MarioVernari 不,它不会,如果它剪切它,那么代码将无法工作!
  • @MarioVernari:即使警告被忽略,它仍然在发布模式下抛出异常,但此行仍然保留return "Inner[foo=" + f.foo + "]";
【解决方案2】:

你必须分配一个像 Foo 一样的对象

        Foo f;
        public Inner(Foo _f)
        {
            f = _f;
        }

【讨论】:

    【解决方案3】:

    要解决此问题,您可以更改以下内容

    f=f;

    this.f = f;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多