問題タブ [default-interface-member]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - メンバーを仮想化すると、デフォルトのインターフェイス実装の呼び出しが妨げられ、C# 8 で StackOverflowException が発生する
次のコードを検討してください。
問題は、子クラスによってオーバーライドできるようDoWork()
にBaseClass
asをマークすると、のデフォルトの実装を呼び出すことができなくなり、.virtual
IChildInterface
DoWork()
StackOverflowException
virtual
から修飾子を削除するDoWork()
とBaseClass
、すべてが機能し、IChildInterface
のデフォルトの実装DoWork()
が呼び出されます。
そのような動作はバグですか、それとも仕様ですか?
一部の子クラスが の独自の実装を提供できるようにする方法はありますかDoWork()
(したがって、 の実装をオーバーライドしますBaseClass
) が、のデフォルトの実装を引き続き使用でき ますか?IChildInterface
DoWork()
c# - 具体的な実装の代わりにデフォルトのメソッドを呼び出すにはどうすればよいですか
C# 8 で既定のインターフェイス メソッドの動作が変更されたのはなぜですか? 過去に次のコード (デフォルトのインターフェイス メソッドがリリースされていないときのデモ):
次の出力があります。
コンソール出力:
I はインターフェイスのデフォルト メソッドです。
私はオーバーライドされたデフォルトのメソッドです!
しかし、C# 8 の最新バージョンでは、上記のコードは次の出力を生成しています。
コンソール出力:
私はオーバーライドされたデフォルトのメソッドです!
私はオーバーライドされたデフォルトのメソッドです!
この動作が変更された理由を誰でも説明できますか?
ノート: