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

所以我的问题是(从我可以在我的示例中更改设计的事实中抽象出来),有没有办法保持特定方法的默认实现,最好不需要求助于 hacky 或静态助手扩展方法?我可以在接口和类中调用静态扩展方法,但这有点违背了这个特性的目的。

// 编辑

我必须承认这让我很困惑,而且我似乎遗漏了一些对其他人来说很明显的重要内容。我没有提供其他信息,因为我认为我的问题不是特定于代码的。让我们看看这个简单的例子(取自我在文章开头链接的网站):

在此处输入图像描述

根据@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

0

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

于 2019-10-29T20:10:40.973 回答