问题标签 [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.

0 投票
2 回答
343 浏览

c# - C# 8 默认接口实现和继承

我想使用 C# 8 默认接口实现来面对我的代码中的性能问题。

实际上,我有这个接口:

我实际上必须对所有进行反射IDataAdapter,检查泛型类型并Insert通过反射调用特定的 T 实例。我想做的是:

编译器说使用关键字 new 来屏蔽继承的方法。但是,我想要完成的唯一一件事是已经实现了一个非泛型方法,以使所有IDataAdapter<T>实现只需要实现泛型版本。

这是我可以完成的事情还是仍然不可能?我已经知道使用抽象类是解决这个问题的一种方法,但我想让开发人员拥有一个实现许多 IDataAdapter 的类......

这是我当前的反射代码:

0 投票
8 回答
5118 浏览

c# - 从实现类调用 C# 接口默认方法

C# 8 支持接口中的默认方法实现。我的想法是将日志记录方法注入到这样的类中:

我收到编译器错误:“当前上下文中不存在该名称”

以这种方式使用默认方法实现是不可能的吗?

编辑:

有关 C# 规则的正确响应,请参阅接受的答案。有关更简洁的解决方案(我的问题的原始想法!),请参阅下面的我自己的答案

0 投票
2 回答
372 浏览

c# - 从实现结构调用 C# 接口默认方法而无需装箱

我唯一能想到的如下,远非理想:

有没有更直接的方法来做到这一点?

(相关以及我是如何解决这个问题的:Calling C# interface default method from implementation class

0 投票
2 回答
704 浏览

c# - C#8.0:具有默认实现的接口的受保护属性

假设我有以下接口:

最初,这些错误迫使我实现ReturnAs,ImageResolutionIsPretty属性。使这些实现protected以 结束CS0535,说这些属性没有实现。另一方面,制作这些public给了我CS8704,告诉我这种实现是不可能的。

除了抽象类之外,这些错误是否有解决方法?

0 投票
2 回答
951 浏览

resharper - 为什么C#8接口成员的默认实现会报错

为什么C#8接口成员的默认实现会报错?

.NET Core 3.0 的配置如屏幕截图所示。

在此处输入图像描述

0 投票
0 回答
449 浏览

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

微软关于提案的页面:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods

所以说我们需要在某个对象上使用 INotifyPropertyChanged。我们现在可以在接口上默认设置一个 SetField 实现:

实现它需要一个向下转换(((INotify)this).SetField),base(INotify)这里最好使用。

0 投票
1 回答
1792 浏览

c# - 具有默认实现的接口和抽象类之间有什么区别?

C# 8.0 引入了一个新的语言特性——接口成员的默认实现。

新的默认接口实现提供了特征语言的元素。然而,这也模糊了抽象类和接口之间的界限。

现在使用抽象类而不是默认实现的接口有什么好处?

0 投票
1 回答
53 浏览

c#-8.0 - 这是公共但抽象的接口方法预期的行为吗?

我最近发现(感谢针对核心 2.2 的损坏构建)现在这在 C# 8 中是合法的

ISimple是一个接口,Simon没有实现,但public关键字是允许的。
我知道接口public中有默认实现,但这个属性没有实现。

与此相比,这绝对是意料之中的

我怀疑这是一个疏忽;如果不是,那么这样做的理由是什么?能有什么用?

0 投票
1 回答
124 浏览

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.

似乎最终这可能是重复的,但得出这个结论是一段旅程:)。

0 投票
2 回答
501 浏览

c# - 使用管道时一直异步

如果我有一个使用管道的应用程序,该管道具有许多要foreach在所有阶段上执行的阶段并调用:

界面是这样的:

它基本上接受一个上下文并返回一个它变得更丰富的上下文。

在其中一个阶段Execute方法中,我需要调用服务,并且想要执行异步操作。所以现在Execute方法需要更改为例如

用于await调用服务。

所有其他阶段都没有异步代码,但现在需要更改,因为最佳实践是“一路异步”。

引入异步代码时必须进行这些更改是否正常?