【问题标题】:Virtual methods without body in a sealed class [closed]密封类中没有主体的虚拟方法[关闭]
【发布时间】:2012-05-19 12:16:11
【问题描述】:

当我尝试运行以下代码时出错。

private sealed class ReqHandler 
{
    public ReqHandler(object @object, IntPtr method);

    public virtual IAsyncResult BeginInvoke(object[] args, AsyncCallback callback, object @object);

    public virtual d0 EndInvoke(IAsyncResult result);

    public virtual d0 Invoke(object[] args);
}

我得到的错误是。

HB_Auth.AuthImpl.ReqHandler.ReqHandler(object, IntPtr)' 必须有一个主体,因为它没有被标记为抽象、外部或部分 (CS0501) (HB_Auth.Patched)

新的虚拟成员HB_Auth.AuthImpl.ReqHandler.BeginInvoke(object[], AsyncCallback, object)' is declared in a sealed classHB_Auth.AuthImpl.ReqHandler' (CS0549) (HB_Auth.Patched)

【问题讨论】:

  • C# 不是 C++:在 C# 中,实现进入类声明。
  • 两个问题:虚方法还需要实现,密封类不能有虚成员。
  • 这看起来不像是一个“基本的 C# 程序”。它不是基本的,不是(有效的)C#,也不是程序。
  • 你的错误是编译错误还是警告?您可以使用 pragma 禁用在代码块之前发现烦人的警告,然后再次打开它们。此外,请参阅下面的我的 cmets,了解有关如何移动虚拟成员但保留声明的可能选项。 [MSDN]msdn.microsoft.com/en-us/library/x74w198a.aspx
  • 您真正的解决方案是学习一些基本的 C# 教程。我们的用户群无法真正教您如何编写 C#。

标签: c# .net virtual abstract sealed


【解决方案1】:
  • 密封类中不能有虚拟成员。

CS0549 错误:

密封类不能作为基类,而虚方法必须在派生类中实现,这是矛盾的。

MSDN

  • 需要实现的功能:

CS0501 错误:

abstract 方法必须有实现。

MSDN

您可能想要创建类protected,以及virtual 函数abstract

【讨论】:

  • 试过了,然后导致更多的错误
  • @user1388129。你想做什么?看起来谷歌搜索 C# 抽象教程可以帮助你。
【解决方案2】:

编译器错误说明了一切: 您已经声明了方法,但它们没有主体。所以,要么给他们一个身体,要么把他们标记为抽象的。 但是,我看到您的类是私有且密封的,因此将它们抽象化是不行的,因为您的类是密封的,因此没有人可以继承它。

但是,您粘贴的代码看起来像反编译代码?

【讨论】:

  • 它是反编译的,不是全部,只是这一点是因为我丢失了记忆棒时丢失了部分源文件
【解决方案3】:

第一个问题:构造函数需要一个主体。你不能只声明一个构造函数,你需要定义它。如果需要,可以使用空构造函数:

public ReqHandler(object @object, IntPtr method) {}

第二个问题:你做了一个密封的类,但是有虚方法。虚拟方法仅用于在扩展此类的类中进行覆盖,但您不能扩展密封类,因此会出现错误。您需要定义这些方法,或者解封类(在这种情况下,您需要扩展它以做任何有用的事情)。

【讨论】:

  • (nitpicking) 虚方法存在 possibility 用于后期绑定,即可能被覆盖:如果没有驱动类覆盖它们,则没有问题。
  • @Vlad True。但是仍然必须有一种可能性,而密封类没有这种可能性。该死的挑剔者。 ;P
  • stackoverflow.com/questions/155087/… Research 说...“您可以通过将虚拟成员插入到基类中来将它们潜入密封类中”
  • 我的反对意见只是反对“虚拟方法仅用于覆盖”,而不是其余的:-P
猜你喜欢
  • 2019-09-24
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多