【问题标题】:C# 8 Call default implementation from within concrete typeC# 8 从具体类型中调用默认实现
【发布时间】:2020-02-03 16:52:58
【问题描述】:

给定以下interface 的默认实现:

public interface IState
{
    string Name => "Unknown";
}

具体实现如下:

public class Demo: IState
{
    public void PrintName()
   { 
       Console.WriteLine(this.Name); // <-- this is invalid syntax
   }
}

是否可以从具体类型中调用默认实现?

我查看了default implementations for C# 8.0 的文档,如果有答案,我无法找到它。

【问题讨论】:

  • 顺便说一句,要了解为什么这不能像书面那样工作(或者至少为什么这是一个坏主意),请考虑Demo 使用Name 实现多个接口,以及它自己的Name 会员。 this.Name 只能明确引用存在于Demo 本身上的Name 成员(可能通过基类)。扩展base 语法is being considered, though
  • 这与显式接口定义相同,因为从前,您需要将this 转换为接口类型,这是没有办法的。

标签: c# .net c#-8.0


【解决方案1】:

您可以通过将this 转换为接口来使用它,并在转换结果上调用属性。就好像该类使用显式接口实现来实现该属性一样。这是一个打印“未知”的完整示例:

using System;

public interface IState
{
    string Name => "Unknown";
}

public class Demo : IState
{
    public void PrintName()
    {
        Console.WriteLine(((IState) this).Name);
    }
}

class Program
{
    static void Main()
    {
        new Demo().PrintName();
    }
}

【讨论】:

  • @ZakkDiaz 它与从 v1 开始存在的显式接口实现没有什么不同
  • @ZakkDiaz:我怀疑 Panagiotis 读了你的评论,说你不知道默认方法实现(在 C# 8 中引入),而不是显式接口实现(在 C# 1 中) )。这当然是我阅读您的评论的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多