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

interface - 无法从派生类中访问接口默认实现方法

我正在尝试 C#8 的新功能,我遇到了这个问题。拥有一个带有默认实现方法的接口,我正在定义一个派生类,该类在其中调用所述方法(构造函数或专有方法)。为什么我看不到接口方法?

与默认实现方法的接口

应包含接口方法的派生类

我的问题是,为什么不this被视为遵守接口合同?为什么它无法访问默认的 impl 方法?

0 投票
0 回答
265 浏览

c# - C#-8 接口中的抽象、虚拟和密封方法

以下界面在使用 C#-8.0 的 .Net Core Console 应用程序中没有错误

abstract防止在界面中添加定义。virtual并且sealed需要在接口中定义。sealed防止h在派生类中实现。

abstract在接口中使用时virtualsealed在当前实现的 C# - 8 版本中是否有任何其他含义或应用程序?它们应该如何以及何时在接口中使用?

0 投票
2 回答
353 浏览

c# - 在 c# 类中找不到默认接口

我在 VS 16.5.1 上的控制台应用程序 .net core 3.1 中有这样的代码:

我想我可以从人本身访问默认实现 oif GetName ,因为它是一个公共方法,但它会产生这个错误:

如何从外部代码或 Person 类本身访问接口的默认实现?谢谢!

0 投票
2 回答
201 浏览

generics - Bug in C# 8.0 compiler or .NET Core 3 run-time?

I think I may have found an issue with either the C# 8.0 compiler or the .NET Core run-time regarding default interface member implementations and generic type parameter constraints.

The general gist of it is that I implemented a very simple design which you can use to reproduce the run-time VerificiationException I get when running a piece of code that compiles just fine and actually should be fine.

So let's get to the code. I created a blank solution with two projects: one C# library targeting .NETStandard 2.1 and one C# test project targeting .NET Core 3.1, where the test-project references the library.

Then in the library project I added the following code:

Note how the DoSomething<TMessageHandler>-methods declare a generic type constraint on TMessageHandler that also references the interface's generic type parameter TMessage.

In the test-project, I added a stub-implementation of the IMessageHandler<TMessage> interface (SomeHandler) to have some type that satisfies the generic type parameter constraint. Then I implemented the following simple test that invokes the ISomeInterface<object>.DoSomething<SomeHandler>'s overload that has the default implementation (note: I use MS Test):

As you would expect, this all compiles just fine.

However, when you run this test, the CLR throws a VerificationException at the point of invoking the DoSomething<...>-method:

System.Security.VerificationException: Method ISomeInterface`1[System.Object].DoSomething: type argument 'TMessageHandler' violates the constraint of type parameter 'TMessageHandler'.

VerificationException

It's as if the run-time cannot see that class SomeHandler actually does satisfy this constraint - which is already checked by the compiler.

After experimenting a bit, I noticed the issue goes away if I change the type parameter constraint to something that doesn't depend on/use the interface's type parameter TMessage. For example, if I simply omit the requirement that TMessageHandler implements IMessageHandler<TMessage>, the code runs just fine:

It's also possible to add other constraints, as long as they don't use TMessage.

Also note that if I keep the generic type parameter constraint intact but move the method's implementation to SomeClass<TMessage> - which is what you would do before C# 8.0 - then the code also runs fine, so it's this particular combination of constraint and default interface method implementation that makes the system crack.

Is this a bug in the compiler or CLR, or am I missing a vital step in my thought-process?

0 投票
0 回答
115 浏览

c# - 这是 Visual Studio 2019 中的错误吗?我在调试时收到程序错误 CS0570

考虑以下接口和实现它的虚拟类。

现在在第 6 行放置一个断点(yield return x)。执行程序,如果您尝试观看 x,您会发现一些奇怪的东西,它会告诉您以下内容:

错误 CS0570:语言不支持“<>x.<>m0(I.d__0)”

显然,该程序可以工作,因此它受到语言的支持,但调试器不知道如何处理它。async对于( Task{T}ValueTask{T}IAsyncEnumerable<T>) 返回方法也会发生这种情况。

在通常的评论流之前,这不是我的实际代码。我有一个使用默认接口成员(接口版本控制)的实际有效用例,我的实际方法更复杂并调用接口的其他成员,但 dim 是生成器方法,调试不合规的实现者是一场噩梦,我基本上不得不求助于日志消息。

0 投票
0 回答
38 浏览

c# - 有没有办法在实现类中调用默认接口方法?

考虑这个接口和类实现器

而不是???调用默认方法的方法是什么?我试过base.M()了,但它不是粉丝。而且我也尝试过base(I).M(),但没有奏效。

0 投票
1 回答
235 浏览

c# - 无法获取 C# 默认接口方法进行编译

C# 8.0 有一个新功能,允许您将默认实现添加到接口上的方法。要么我做错了,要么这个功能不像宣传的那样工作。(我猜是前者。)

我使用以下代码创建了一个新的 .NET Core 3.1 控制台应用程序:

Console.WriteLine(xxx.GetItNow()));语句无法编译,因为

Myclass 不包含“GetItNow()”的定义...

MyClass因此,编译器对没有显式引用的事实感到满意GetItNow()(它不会抱怨MyClass没有实现接口)。但它不会将默认接口成员视为实现该接口的类的公共方法。

我错过了什么,还是有什么坏了?

0 投票
3 回答
435 浏览

c# - C# 类可以从自己的实现中调用接口的默认接口方法吗?

如果我有这样的默认接口方法:

我可以让我的具体实现调用该默认方法吗?

所以调用:

结果如下:

实际上,从实现类调用 C# 接口默认方法表明我可以调用我的类未实现的方法,但正如预期的那样,向((IGreeter)this).SayHello(name);内部添加调用HappyGreeter.SaysHello会导致堆栈溢出。

0 投票
2 回答
1816 浏览

c# - 我们什么时候应该在 C# 中使用默认接口方法?

C# 8及更高版本中,我们有默认的接口方法,因此:

它不会破坏接口的原理吗?

我们什么时候应该使用默认接口方法而不是基(抽象)类

0 投票
2 回答
531 浏览

c# - 当我在类派生形式的接口中调用它时,为什么我需要将“this”转换为具有 C# 8.0 中默认实现的接口?

我在带有 C# 8 的 .NET Core 3.1 中有这个简单的控制台程序:

我不明白为什么演员阵容是必要的((ITest)(this)).test();

Test 直接派生自 ITest,因此,根据定义,'this' IS ITest

谢谢你。