问题标签 [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 投票
1 回答
406 浏览

c# - 在实现具有默认方法实现的接口的类上使用`GetMethod`返回null

我有几个接口 (IMapFromIMapTo) 可以让我简化AutoMapper配置。MapTo每个接口都有和MapFrom方法的默认实现。我有一个单独的MappingProfile类,它使用反射来查找所有实现类,并调用它们的映射创建。

上述类如下所示:

如果实现接口的类覆盖了默认接口实现,则MappingProfile该类将按需要工作。但是,如果类仅仅依赖于默认实现,mapTo并且mapFromApplyMappingsFromAssembly方法中都是空的。

例如,此类将不会成功应用其映射:

如果它们没有在继承类中重新实现,我如何获得默认实现?

0 投票
1 回答
625 浏览

c# - C# 8.0 默认接口成员的意外行为

考虑以下代码:

它在 .NET Core 3.1.402 中产生以下意外输出:

A没有 的成员的隐式或显式实现I,因此我希望默认实现用于C,因为C继承了 的接口映射A并且没有显式地重新实现I。根据 ECMA-334 (18.6.6) 和 C# 6.0 语言规范:

一个类继承其基类提供的所有接口实现。

如果不显式地重新实现接口,派生类就不能以任何方式更改它从其基类继承的接口映射。

特别是,我希望得到以下输出:

这确实A是未声明为抽象时发生的情况。

上述代码的行为是在 C# 8.0 中设计的,还是某个错误的结果?如果有意,为什么只有在声明为 virtual(在但不是的情况下)并且仅在声明为抽象时才C隐式实现相应的成员?IM2M1A

编辑:

虽然我仍然不清楚这是一个错误还是一个功能(我倾向于认为这是一个错误,并且第一条评论中链接的讨论到目前为止还没有定论),但我想出了一个更危险的场景:

请注意,接口Library.I和类对于各自的类Program.C私有的。特别是,该方法Program.C.Method应该不能从类外部访问Program。类的作者Program可能认为可以完全控制何时Program.C.Method调用方法,甚至可能不知道接口Library.I(因为它是私有的)。但是,它是从 调用的Library.A.OtherMethod,因为输出是:

这看起来像是一种脆弱的基类问题。被宣布为公开的事实Program.C.Method应该是无关紧要的。请参阅 Eric Lippert 的这篇博客文章,其中描述了一个不同但有些相似的场景。

0 投票
1 回答
64 浏览

c# - 谁能解释 C# 8.0 中的默认接口实现是什么?

我对 C# 8.0 很陌生,我想知道默认接口实现是什么?

0 投票
2 回答
108 浏览

c# - 如何在子接口中提供默认实现?

如果我有一个界面IExampleInterface

有没有办法GetValue()在子接口中提供默认实现?IE:

0 投票
0 回答
26 浏览

c#-9.0 - C# 9 默认实现导致错误

我在 c# 9 中遇到了默认实现的问题。这是我的问题。每次我尝试使用默认实现时,都会收到此错误“ToyotaCorolla”不包含“canOffroad”的定义,并且找不到接受“ToyotaCorolla”类型的第一个参数的可访问扩展方法“canOffroad”(你错过了吗? using 指令或程序集引用?) [carApp]

这是界面:

这是课程的一部分(没有canOffroad)

这是导致问题的主要方法的一部分。

我查看了许多网站,它看起来与他们的示例完全相同。此外,我知道我正确地将命名空间导入到 main 方法中,因为 corolla1 和 JeepWrangler 类与 ICar 接口位于同一个文件中。

是什么导致了这个问题?

0 投票
3 回答
75 浏览

c# - 我们如何使用不同接口的默认实现?

据我所知,我需要将继承类的实例向上转换到实现所需方法的接口,然后调用它。

如果我需要的具有不同方法的默认实现的接口很少怎么办?是否有一些模式可以解决这个问题,或者我应该总是使用关键字来调用某个接口的方法?

0 投票
2 回答
288 浏览

c# - 使用接口的委托作为参数类型时逆变无效

考虑带有委托的逆变接口定义:

Baz失败并出现错误的定义:

CS1961
无效方差:类型参数“ TInput”必须在“ IInterface<TInput>.Baz(TInput, IInterface<TInput>.Foo)”上协变有效。' TInput' 是逆变的。

我的问题是为什么?乍一看,这应该是有效的,因为Foo委托与TInput. 我不知道是编译器过于保守还是我遗漏了什么。

请注意,通常您不会在接口中声明委托,特别是这不会在 C# 8 之前的版本上编译,因为接口中的委托需要默认接口​​实现。

如果允许此定义,是否有办法打破类型系统,或者编译器是否保守?

0 投票
1 回答
279 浏览

c# - C# 9 - 如何使用反射调用默认接口方法?

我有一个自动映射器的接口。DTO 实现了这个接口。如您所见,有一个默认方法。

当我尝试调用此方法时。找不到方法。

如何调用默认接口方法?

0 投票
2 回答
643 浏览

c# - C# 默认接口实现 - 无法覆盖

我正在按照本指南https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods使用默认接口实现功能。我复制了一个在 interface 中定义默认实现的代码,IA然后在 interface 中覆盖它IB

但它给出了一个错误CS0106 The modifier 'override' is not valid for this item和一个警告CS0108 'I1.M()' hides inherited member 'I0.M()'. Use the new keyword if hiding was intendedTargetFramework设置为net5.0,LangVersionlatest. 为什么即使在官方文档中描述它也不起作用?

0 投票
1 回答
47 浏览

c# - 为什么在实现的类中没有接口名称就不能访问接口中定义的常量?

我们有接口和实现类:

为什么我不能在没有“IInterface.”的情况下访问 StackContainer 中的常量?

PS:我在这里的目的是将 const 放置在某个地方而不是 StackContainer 以便轻松访问它。如果它是在 StackContainer 中定义的,我可以像这样使用它:StackContainer.DefaultStack,但我认为这不是一个好的决定。