问题标签 [default-interface-member]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# 8 默认接口实现和继承
我想使用 C# 8 默认接口实现来面对我的代码中的性能问题。
实际上,我有这个接口:
我实际上必须对所有进行反射IDataAdapter
,检查泛型类型并Insert
通过反射调用特定的 T 实例。我想做的是:
编译器说使用关键字 new 来屏蔽继承的方法。但是,我想要完成的唯一一件事是已经实现了一个非泛型方法,以使所有IDataAdapter<T>
实现只需要实现泛型版本。
这是我可以完成的事情还是仍然不可能?我已经知道使用抽象类是解决这个问题的一种方法,但我想让开发人员拥有一个实现许多 IDataAdapter 的类......
这是我当前的反射代码:
c# - 从实现结构调用 C# 接口默认方法而无需装箱
我唯一能想到的如下,远非理想:
有没有更直接的方法来做到这一点?
(相关以及我是如何解决这个问题的:Calling C# interface default method from implementation class)
c# - C#8.0:具有默认实现的接口的受保护属性
假设我有以下接口:
最初,这些错误迫使我实现ReturnAs
,ImageResolution
和IsPretty
属性。使这些实现protected
以 结束CS0535
,说这些属性没有实现。另一方面,制作这些public
给了我CS8704
,告诉我这种实现是不可能的。
除了抽象类之外,这些错误是否有解决方法?
c# - C# 8.0 默认接口实现基本语法/显式调用
我一直在搞乱默认的接口实现。认为您必须对接口类型进行向下转换才能使用默认方法实现。我还发现了一堆关于另一种语法的注释,我找不到它是否已经包含在内,我确实找到了关于它的外观的“决定”,但是它不起作用。我做错了还是这个新语法还没有包括在内?
有点相关但没有回答我的问题: Calling C# interface default method from implementation struct without boxing
base<>/base()
语法注释: https ://github.com/dotnet/cshaplang/blob/master/meetings/2018/LDM-2018-11-14.md#default-interface-implementations
所以说我们需要在某个对象上使用 INotifyPropertyChanged。我们现在可以在接口上默认设置一个 SetField 实现:
实现它需要一个向下转换(((INotify)this).SetField
),base(INotify)
这里最好使用。
c# - 具有默认实现的接口和抽象类之间有什么区别?
C# 8.0 引入了一个新的语言特性——接口成员的默认实现。
新的默认接口实现提供了特征语言的元素。然而,这也模糊了抽象类和接口之间的界限。
现在使用抽象类而不是默认实现的接口有什么好处?
c#-8.0 - 这是公共但抽象的接口方法预期的行为吗?
我最近发现(感谢针对核心 2.2 的损坏构建)现在这在 C# 8 中是合法的
ISimple
是一个接口,Simon
没有实现,但public
关键字是允许的。
我知道接口public
中有默认实现,但这个属性没有实现。
与此相比,这绝对是意料之中的
我怀疑这是一个疏忽;如果不是,那么这样做的理由是什么?能有什么用?
resharper - C# 8.0的实现类中如何保留部分接口方法的默认实现?
有人会认为在 C# 8.0 中您应该能够执行以下操作(根据此(第一个片段)):
上面的示例无法编译,因为接口成员需要显式且完整地实现(包括提供默认逻辑的方法)
所以有人会认为以下应该有效:
不,看起来这个方法是递归的(尽管向上转换)并且会导致我们最喜欢的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
.
似乎最终这可能是重复的,但得出这个结论是一段旅程:)。
c# - 使用管道时一直异步
如果我有一个使用管道的应用程序,该管道具有许多要foreach
在所有阶段上执行的阶段并调用:
界面是这样的:
它基本上接受一个上下文并返回一个它变得更丰富的上下文。
在其中一个阶段Execute
方法中,我需要调用服务,并且想要执行异步操作。所以现在Execute
方法需要更改为例如
用于await
调用服务。
所有其他阶段都没有异步代码,但现在需要更改,因为最佳实践是“一路异步”。
引入异步代码时必须进行这些更改是否正常?