这个 C# 接口语法叫什么,它是什么意思

What is this C# interface syntax called and what does it mean

我正在研究一组相当复杂的接口,它允许定义具有特定结构的对象。通过接口和泛型,它还允许我定义每个元素中可用的接口组合。该结构映射了我们背景中的某些内容,因此目标是在代码中重新创建结构,以便更好地理解代码实际操作的内容。

结果如下所示:

static void Main(string[] args)
{

  IComplexDefinition1 CD1 = null;
  
  CD1.Access.Level1.ElementB.SomeStructrueMethod();
  CD1.Access.Level1.ElementC.ActorAMethod1();
  CD1.Access.Level1.ElementC.ActorBMethod2();
  CD1.Access.Level1.ElementC.ActorCMethod1();

  CD1.Access.Level2.ElementA.SomeOperationPoolMethod();
  CD1.Access.Level2.ElementC.ActorAMethod2();
  CD1.Access.Level2.ElementC.ActorBMethod1();
  CD1.Access.Level2.ElementC.ActorCMethod2();

}

现在开始实施具体的 class 我点击了 Visual Studio 中的“自动实施”,它出现了一行我迄今为止从未见过的代码(并且没想到发生)。所以我正在寻找它是如何工作的,以及我在哪里可以 read/study 更多关于它的信息。

具体实现的相关部分为:

public class ComplexDefinition : IComplexDefinition1,....
{

  protected IActorComposition _actors;
  protected SomeStructure _structure;
  protected SomeOperationPool _operationPool;

  public IElementsBC<IActorCompositionLevel2, SomeStructure> Level1 => this;
  public IElementsAC<IActorCompositionLevel1, SomeOperationPool> Level2 => this;
  
  public SomeStructure ElementB => _structure;
  public SomeOperationPool ElementA => _operationPool;

  public IActorCompositionLevel2 ElementC => _actors;
  IActorCompositionLevel1 IElementC<IActorCompositionLevel1>.ElementC => _actors;

}

特别是这两行让我很困扰(尤其是最后一行):

public IActorCompositionLevel2 ElementC => _actors;
IActorCompositionLevel1 IElementC<IActorCompositionLevel1>.ElementC => _actors;

第一行很清楚,正如我们所知

  [visibility] [Type]                  [Name]   => [what gets returned]
  public       IActorCompositionLevel2 ElementC => _actors;

第二行不具有相同的可见性(虽然两者都是 public)并且类型定义更复杂并且在名称之前有一个额外的点(这是我没有看到的部分所以远)。

IActorCompositionLevel1 IElementC<IActorCompositionLevel1>.ElementC

在最后一行,我认为您正在寻找的是显式接口实现。如果您使用相同的方法实现 2 个不同的接口,那么您可以使用此构造来区分它们。

例如:

public class TestClass : IInterface1, IInterface2
{
    void IInterface1.SameMethod()
    {
        System.Console.WriteLine("IInterface1");
    }
    void IInterface2.SameMethod()
    {
        System.Console.WriteLine("IInterface2");
    }
}

// now if you create the class itself then the type you are assigning it into will decide what method it should call
TestClass test = new TestClass();
test.SameMethod(); // this won't compile, since it won't know what to call

(test as IInterface1).SameMethod(); // this should display "IInterface1" in console

official docs.

中有更多相关内容

=> 是 Expression-bodied 成员,它基本上像 shorthand 一样工作,每次访问 属性 时都会调用一个函数。您可以将其视为 shorthand for

IActorCompositionLevel1 IElementC<IActorCompositionLevel1>.ElementC {
    get {
        return _actors;
    }
}

手写的,所以不要尝试编译它。不过应该能说明问题