有人会认为在 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
.
似乎最终这可能是重复的,但得出这个结论是一段旅程:)。