0

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 (...)、私がスクリーンショットしたものは真実ではないはずです。教えてください。

// 編集 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

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

4

1 に答える 1