問題タブ [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.

0 投票する
3 に答える
256 参照

c# - メンバーを仮想化すると、デフォルトのインターフェイス実装の呼び出しが妨げられ、C# 8 で StackOverflowException が発生する

次のコードを検討してください。

問題は、子クラスによってオーバーライドできるようDoWork()BaseClassasをマークすると、のデフォルトの実装を呼び出すことができなくなり、.virtualIChildInterfaceDoWork()StackOverflowException

virtualから修飾子を削除するDoWork()BaseClass、すべてが機能し、IChildInterfaceのデフォルトの実装DoWork() が呼び出されます。

そのような動作はバグですか、それとも仕様ですか?

一部の子クラスが の独自の実装を提供できるようにする方法はありますかDoWork()(したがって、 の実装をオーバーライドしますBaseClass) が、のデフォルトの実装を引き続き使用でき ますか?IChildInterfaceDoWork()

0 投票する
1 に答える
1010 参照

c# - 具体的な実装の代わりにデフォルトのメソッドを呼び出すにはどうすればよいですか

C# 8 で既定のインターフェイス メソッドの動作が変更されたのはなぜですか? 過去に次のコード (デフォルトのインターフェイス メソッドがリリースされていないときのデモ):

次の出力があります。

コンソール出力:

I はインターフェイスのデフォルト メソッドです。
私はオーバーライドされたデフォルトのメソッドです!

しかし、C# 8 の最新バージョンでは、上記のコードは次の出力を生成しています。

コンソール出力:

私はオーバーライドされたデフォルトのメソッドです!
私はオーバーライドされたデフォルトのメソッドです!

この動作が変更された理由を誰でも説明できますか?

ノート: