问题标签 [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# - 在实现具有默认方法实现的接口的类上使用`GetMethod`返回null
我有几个接口 (IMapFrom
和IMapTo
) 可以让我简化AutoMapper
配置。MapTo
每个接口都有和MapFrom
方法的默认实现。我有一个单独的MappingProfile
类,它使用反射来查找所有实现类,并调用它们的映射创建。
上述类如下所示:
如果实现接口的类覆盖了默认接口实现,则MappingProfile
该类将按需要工作。但是,如果类仅仅依赖于默认实现,mapTo
并且mapFrom
在ApplyMappingsFromAssembly
方法中都是空的。
例如,此类将不会成功应用其映射:
如果它们没有在继承类中重新实现,我如何获得默认实现?
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
隐式实现相应的成员?I
M2
M1
A
编辑:
虽然我仍然不清楚这是一个错误还是一个功能(我倾向于认为这是一个错误,并且第一条评论中链接的讨论到目前为止还没有定论),但我想出了一个更危险的场景:
请注意,接口Library.I
和类对于各自的类Program.C
是私有的。特别是,该方法Program.C.Method
应该不能从类外部访问Program
。类的作者Program
可能认为可以完全控制何时Program.C.Method
调用方法,甚至可能不知道接口Library.I
(因为它是私有的)。但是,它是从 调用的Library.A.OtherMethod
,因为输出是:
这看起来像是一种脆弱的基类问题。被宣布为公开的事实Program.C.Method
应该是无关紧要的。请参阅 Eric Lippert 的这篇博客文章,其中描述了一个不同但有些相似的场景。
c# - 谁能解释 C# 8.0 中的默认接口实现是什么?
我对 C# 8.0 很陌生,我想知道默认接口实现是什么?
c# - 如何在子接口中提供默认实现?
如果我有一个界面IExampleInterface
:
有没有办法GetValue()
在子接口中提供默认实现?IE:
c#-9.0 - C# 9 默认实现导致错误
我在 c# 9 中遇到了默认实现的问题。这是我的问题。每次我尝试使用默认实现时,都会收到此错误“ToyotaCorolla”不包含“canOffroad”的定义,并且找不到接受“ToyotaCorolla”类型的第一个参数的可访问扩展方法“canOffroad”(你错过了吗? using 指令或程序集引用?) [carApp]
这是界面:
这是课程的一部分(没有canOffroad)
这是导致问题的主要方法的一部分。
我查看了许多网站,它看起来与他们的示例完全相同。此外,我知道我正确地将命名空间导入到 main 方法中,因为 corolla1 和 JeepWrangler 类与 ICar 接口位于同一个文件中。
是什么导致了这个问题?
c# - 我们如何使用不同接口的默认实现?
据我所知,我需要将继承类的实例向上转换到实现所需方法的接口,然后调用它。
如果我需要的具有不同方法的默认实现的接口很少怎么办?是否有一些模式可以解决这个问题,或者我应该总是使用关键字来调用某个接口的方法?
c# - 使用接口的委托作为参数类型时逆变无效
考虑带有委托的逆变接口定义:
Baz
失败并出现错误的定义:
CS1961
无效方差:类型参数“TInput
”必须在“IInterface<TInput>.Baz(TInput, IInterface<TInput>.Foo)
”上协变有效。'TInput
' 是逆变的。
我的问题是为什么?乍一看,这应该是有效的,因为Foo
委托与TInput
. 我不知道是编译器过于保守还是我遗漏了什么。
请注意,通常您不会在接口中声明委托,特别是这不会在 C# 8 之前的版本上编译,因为接口中的委托需要默认接口实现。
如果允许此定义,是否有办法打破类型系统,或者编译器是否保守?
c# - C# 9 - 如何使用反射调用默认接口方法?
我有一个自动映射器的接口。DTO 实现了这个接口。如您所见,有一个默认方法。
当我尝试调用此方法时。找不到方法。
如何调用默认接口方法?
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 intended
。TargetFramework
设置为net5.0
,LangVersion
是latest
. 为什么即使在官方文档中描述它也不起作用?
c# - 为什么在实现的类中没有接口名称就不能访问接口中定义的常量?
我们有接口和实现类:
为什么我不能在没有“IInterface.”的情况下访问 StackContainer 中的常量?
PS:我在这里的目的是将 const 放置在某个地方而不是 StackContainer 以便轻松访问它。如果它是在 StackContainer 中定义的,我可以像这样使用它:StackContainer.DefaultStack,但我认为这不是一个好的决定。