问题标签 [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.
interface - 无法从派生类中访问接口默认实现方法
我正在尝试 C#8 的新功能,我遇到了这个问题。拥有一个带有默认实现方法的接口,我正在定义一个派生类,该类在其中调用所述方法(构造函数或专有方法)。为什么我看不到接口方法?
与默认实现方法的接口
应包含接口方法的派生类
我的问题是,为什么不this
被视为遵守接口合同?为什么它无法访问默认的 impl 方法?
c# - C#-8 接口中的抽象、虚拟和密封方法
以下界面在使用 C#-8.0 的 .Net Core Console 应用程序中没有错误
abstract
防止在界面中添加定义。virtual
并且sealed
需要在接口中定义。sealed
防止h
在派生类中实现。
abstract
在接口中使用时virtual
, sealed
在当前实现的 C# - 8 版本中是否有任何其他含义或应用程序?它们应该如何以及何时在接口中使用?
c# - 在 c# 类中找不到默认接口
我在 VS 16.5.1 上的控制台应用程序 .net core 3.1 中有这样的代码:
我想我可以从人本身访问默认实现 oif GetName ,因为它是一个公共方法,但它会产生这个错误:
如何从外部代码或 Person 类本身访问接口的默认实现?谢谢!
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'.
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?
c# - 这是 Visual Studio 2019 中的错误吗?我在调试时收到程序错误 CS0570
考虑以下接口和实现它的虚拟类。
现在在第 6 行放置一个断点(yield return x)。执行程序,如果您尝试观看 x,您会发现一些奇怪的东西,它会告诉您以下内容:
错误 CS0570:语言不支持“<>x.<>m0(I.d__0)”
显然,该程序可以工作,因此它受到语言的支持,但调试器不知道如何处理它。async
对于( Task{T}
、ValueTask{T}
或IAsyncEnumerable<T>
) 返回方法也会发生这种情况。
在通常的评论流之前,这不是我的实际代码。我有一个使用默认接口成员(接口版本控制)的实际有效用例,我的实际方法更复杂并调用接口的其他成员,但 dim 是生成器方法,调试不合规的实现者是一场噩梦,我基本上不得不求助于日志消息。
c# - 有没有办法在实现类中调用默认接口方法?
考虑这个接口和类实现器
而不是???
调用默认方法的方法是什么?我试过base.M()
了,但它不是粉丝。而且我也尝试过base(I).M()
,但没有奏效。
c# - 无法获取 C# 默认接口方法进行编译
C# 8.0 有一个新功能,允许您将默认实现添加到接口上的方法。要么我做错了,要么这个功能不像宣传的那样工作。(我猜是前者。)
我使用以下代码创建了一个新的 .NET Core 3.1 控制台应用程序:
该Console.WriteLine(xxx.GetItNow()));
语句无法编译,因为
Myclass 不包含“GetItNow()”的定义...
MyClass
因此,编译器对没有显式引用的事实感到满意GetItNow()
(它不会抱怨MyClass
没有实现接口)。但它不会将默认接口成员视为实现该接口的类的公共方法。
我错过了什么,还是有什么坏了?
c# - C# 类可以从自己的实现中调用接口的默认接口方法吗?
如果我有这样的默认接口方法:
我可以让我的具体实现调用该默认方法吗?
所以调用:
结果如下:
实际上,从实现类调用 C# 接口默认方法表明我可以调用我的类未实现的方法,但正如预期的那样,向((IGreeter)this).SayHello(name);
内部添加调用HappyGreeter.SaysHello
会导致堆栈溢出。
c# - 当我在类派生形式的接口中调用它时,为什么我需要将“this”转换为具有 C# 8.0 中默认实现的接口?
我在带有 C# 8 的 .NET Core 3.1 中有这个简单的控制台程序:
我不明白为什么演员阵容是必要的((ITest)(this)).test();
Test 直接派生自 ITest,因此,根据定义,'this' IS ITest
谢谢你。