人们会认为,在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方法?我可以在接口和类中都调用静态扩展方法,但这有点违反了此功能的目的。
//编辑
我必须承认它使我感到困惑,并且看来我缺少对其他人显而易见的重要信息。我没有提供其他信息,因为我不认为我的问题是特定于代码的。让我们看一个简单的例子(摘自我在文章开头链接的网站):
根据@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
中发生这些错误时,可以选择阻止编译。
看来这最终可能是重复的,但是得出这个结论是一段漫长的旅程:)。
答案 0 :(得分:0)
该问题是由ReSharper
引起的,参考:
https://youtrack.jetbrains.com/issue/RSRP-474628
看来该问题将在版本v2019.3
中解决,并且我们目前有v2019.2.3
。您可以根据问题的严重程度设置ReSharper
来阻止编译,解决方法是暂时禁用此功能。