【问题标题】:"Click" - Delegate to an instance method cannot have null 'this'“点击” - 委托给实例方法不能有 null 'this'
【发布时间】:2016-03-01 20:02:19
【问题描述】:

我知道这个话题有很多问题。但我似乎无法真正理解整个委托的内容。我有点想让它工作并继续前进。每次看到代表时,我都会想,一定有一种方法可以让这件事更容易理解和做,但我似乎找不到。

我有一个 FlowLayoutPanel 将填充一堆面板。每个面板都需要附加一个 OnClick(或 Click?)方法。

所以我继续写了(在我的个人面板类的创建者内部):

IntDrawForm form = FindForm() as IntDrawForm;
Click += form.PointPanelClick;

当我尝试创建一个我的面板时,我得到了错误消息Delegate to an instance method cannot have null 'this'

【问题讨论】:

  • 您所问的内容非常模棱两可。你用什么语言写作?错误信息是什么?
  • @gmoshkin:我认为在这种情况下假设它是 C# 是合理的,并且我相信错误消息与标题一样,尽管这肯定会更清楚。
  • 表单可能为空。试试:if (form != null) { Click += form.PointPanelClick; }。顺便说一句,我假设您正在使用 C# 进行编码。
  • 非常抱歉,是的,这是c#

标签: c# delegates


【解决方案1】:

是的,如果FindForm() 返回null 或不是IntDrawForm 的实例,就会发生这种情况。这里没有什么特别针对代表的 - 如果您将其作为第二行尝试,您会得到类似的结果:

form.CallSomeMethod();

(在这种情况下,它将是NullReferenceException。)

考虑到当formnull 时第二行基本上会失败,所以你不应该在这里使用as - 改用演员表。这样一来,如果您没有 IntDrawFormfirst 行将失败,并且您将获得更多信息的异常。

IntDrawForm form = (IntDrawForm) FindForm();

现在我们不知道为什么FindForm() 返回了null 或非IntDrawForm,但这是另一回事。

【讨论】:

  • 啊是的,当然表单是空的。 ^^ 代表的东西让我非常愤怒,以至于我完全忽略了这一点。我在创作者中写这个。所以面板还没有在表单上的任何地方。我只需要发送我的表单句柄作为参数。多谢。该死的,我觉得自己很愚蠢..
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多