如何在C#8.0的实现类中保留某些接口方法的默认实现?

时间:2019-10-26 14:27:51

标签: resharper .net-core-3.0 c#-8.0 default-interface-member

人们会认为,在C#8.0中,您应该能够执行以下操作(根据this (1st snippet)):

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异常。

所以我的问题是(从我可以更改示例中的设计这一事实出发),有没有一种方法可以使特定方法的默认实现保持默认状态,最好不必借助hacky或Static Helper Extension方法?我可以在接口和类中都调用静态扩展方法,但这有点违反了此功能的目的。

//编辑

我必须承认它使我感到困惑,并且看来我缺少对其他人显而易见的重要信息。我没有提供其他信息,因为我不认为我的问题是特定于代码的。让我们看一个简单的例子(摘自我在文章开头链接的网站):

enter image description here

根据@Panagiotis Kanavos条评论:No, default members don't need to be implemented (...)我截屏的内容不正确。某人可以开导我吗?

//编辑2

如您所见,我正确地将.NET CORE 3.0定位为C# 8.0

enter image description here enter image description here enter image description here enter image description here

错误:

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中发生这些错误时,可以选择阻止编译。

看来这最终可能是重复的,但是得出这个结论是一段漫长的旅程:)。

1 个答案:

答案 0 :(得分:0)

该问题是由ReSharper引起的,参考:
https://youtrack.jetbrains.com/issue/RSRP-474628
看来该问题将在版本v2019.3中解决,并且我们目前有v2019.2.3。您可以根据问题的严重程度设置ReSharper来阻止编译,解决方法是暂时禁用此功能。