2

私が理解しているように、抽象としてマークされているメソッドは暗黙的に仮想です。理由:特定のオブジェクトのコンパイル時の型が抽象であると仮定します。オブジェクトの抽象メソッドの1つが呼び出されている場合、実行される実際のメソッドは、オブジェクトの実行時型で定義されているメソッドです。ではない?私が正しければ、抽象メソッドは仮想メソッドであるかのように動作します。

それにもかかわらず、私はC#メソッドを抽象と仮想の両方で同時にマークすることに成功しました。

public abstract virtual void crazy();

抽象メソッドは必ずしも仮想である必要はなく、抽象であることは実際には仮想であることと直交していることを意味していると思います。

何が間違っていますか?どうして抽象メソッドを仮想化できないのでしょうか?

4

3 に答える 3

8

abstractメソッドをとの両方としてマークすることはできませんvirtual。コンパイラエラーが発生します。

抽象メソッド'Namespace.Class.Foo()'は仮想としてマークできません

残りの質問は正しいです:abstractメソッドは暗黙的にvirtualです。

于 2013-02-20T13:10:04.937 に答える
3

MSDNから

  • 抽象メソッドは暗黙的に仮想メソッドです。
  • 抽象メソッド宣言は、抽象クラスでのみ許可されます。
  • 抽象メソッド宣言は実際の実装を提供しないため、メソッド本体はありません。メソッド宣言は単にセミコロンで終わり、署名の後に中括弧({})はありません。
  • 実装は、非抽象クラスのメンバーであるオーバーライドメソッドによって提供されます。
  • 抽象メソッド宣言で静的修飾子または仮想修飾子を使用するとエラーになります。
于 2013-02-20T13:14:49.920 に答える
2

「仮想修飾子を静的、抽象、プライベート、またはオーバーライド修飾子と一緒に使用することはできません。」

于 2013-02-20T13:10:34.280 に答える