C#8.0の実装クラスでインターフェイスメソッドのデフォルトの実装の一部を保持するにはどうすればよいですか?

rvnlord

C#8.0では、次のことができるはずだと思うでしょう(これ(最初のスニペット)によると):

public interface IRestApiClient : IRestClient
{
    ...
    Task<T> PostPrivateAsync<T>(string action, OrderedDictionary<string, object> parameters = null, DeserializeCustom<T> deserializer = null)
    {
        return QueryPrivateAsync(Method.POST, action, parameters, deserializer);
    }
    ...
}

public class SpecificClient : ExchangeClient, IRestApiClient, IRestHtmlClient, ISeleniumClient, IWebSocketClient
{

}

上記の例は、インターフェイスメンバーを明示的かつ完全に実装する必要があるため、コンパイルされません(デフォルトロジックを提供するメソッドを含む)

したがって、次のことが機能するはずだと思うでしょう。

public interface IRestApiClient : IRestClient
{
    ...
    Task<T> PostPrivateAsync<T>(string action, OrderedDictionary<string, object> parameters = null, DeserializeCustom<T> deserializer = null)
    {
        return QueryPrivateAsync(Method.POST, action, parameters, deserializer);
    }
    ...
}

public class SpecificClient : ExchangeClient, IRestApiClient, IRestHtmlClient, ISeleniumClient, IWebSocketClient
{
    ...
    public async Task<T> PostPrivateAsync<T>(string action, OrderedDictionary<string, object> parameters = null, DeserializeCustom<T> deserializer = null) 
        => await ((IRestApiClient) this).PostPrivateAsync(action, parameters, deserializer);
    ...
}

いいえ、このメソッドは(アップキャストにもかかわらず)再帰的であり、私たちのお気に入りのStack Overflow例外を引き起こすようです。

だから私の質問は(私の例でデザインを変更できるという事実から抽象化して)、できればハッキーまたは静的ヘルパー拡張メソッドに頼る必要なしに、特定のメソッドのデフォルトの実装を維持する方法はありますか?インターフェイスとクラスの両方で静的拡張メソッドを呼び出すことはできますが、この機能の目的が損なわれます。

//編集

私はそれが私を混乱させていることを認めなければなりません、そして私は他の人々に明白である重要な何かを見逃しているようです。問題がコード固有であるとは考えていなかったため、追加情報は提供しませんでした。この簡単な例を見てみましょう(投稿の冒頭でリンクしたWebサイトから取得):

ここに画像の説明を入力してください

@Panagiotis KanavosコメントによるとNo, default members don't need to be implemented (...)私がスクリーンショットを撮ったことは真実ではないはずです。sbは私を啓発できますか?

//編集2

ご覧のとおり、私はで適切にターゲティング.NET CORE 3.0していC# 8.0ます。

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

エラー:

Interface method cannot declare a body
Interface member 'void CryptoBotCoreMVC.IDefaultInterfaceMethod.DefaultMethod()' is not implemented

コメントの質問に答えるには:ファイルでLangVersion明示的に指定しませんでした.csproj

//編集3

問題はReSharperでした。https://stackoverflow.com/a/58614702/3783852を参照してください。

私のコメントは、おそらく回答の所有者によって削除されたので、ここに書き込みます。手がかりは、実際にはエラー番号がなかったという事実でしたが、コンパイルはブロックされました。これらのエラーがで発生した場合、コンパイルをブロックするオプションがあることが判明しましたReSharper

結局、これは重複の可能性があるようですが、この結論に到達することはかなりの旅でした:)。

rvnlord

この問題の原因はReSharper次のとおりです
。https //youtrack.jetbrains.com/issue/RSRP-474628
問題はバージョンで解決されるようで、v2019.3現在はv2019.2.3ReSharper問題の重大度に応じてコンパイルをブロックするように設定できます。回避策は、当面この機能を無効にすることです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ