1

我在 Visual Studio 2019 中有一个 .Net 6.0 应用程序。我正在尝试使默认接口实现正常工作。出于某种原因,它似乎没有识别类定义中的默认实现。

这是一个示例代码片段:

public interface IFooBar
{
    protected bool BoolProperty { get; set; }
    protected Guid StringProperty { get; set; }
    
    protected void SampleMethod1(string param)
    {
    }
    
    protected void SampleMethod2()
    {
    }
}

public class FooBase
{
}

public class Foo : FooBase, IFooBar
{

    protected bool IFooBar.BoolProperty { get; set; }
    protected Guid IFooBar.StringProperty { get; set; }
    
    protected SomeMethod()
    {
        SampleMethod1("Test String");
    }
}

这是我的 Visual Studio 2019 项目文件中的一个片段:

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <LangVersion>preview</LangVersion>
</PropertyGroup>

这是我看到的错误消息。

错误 CS0103 当前上下文中不存在名称“SampleMethod1”

我有两个问题/问题:

  1. 为什么编译器要求我在具体类中定义接口属性:protected bool IFooBar.BoolProperty { get; 放; } 受保护的 Guid IFooBar.StringProperty { get; 放; }

  2. 为什么在我的具体类中无法识别默认方法实现?

4

1 回答 1

1

事实证明,受保护的默认接口方法成员必须由实现类显式实现,但只能从派生接口访问。

例如:

public interface IBase
{
    protected string StringProperty { get; set; }
    
    protected void BaseMethod(string param) => Console.WriteLine($"IBase.BaseMethod: {param}");
}

public interface IDerived : IBase
{
    public void DerivedMethod()
    {
        // SampleMethod1, SampleMethod2 and StringProperty are accessible.
        BaseMethod(StringProperty);
    }
}

public class Foo : IDerived
{
    // Protected DIM properties must be explicitly implemented.
    // They can be initialized, interestingly, but are otherwise inaccessible to Foo.
    string IBase.StringProperty { get; set; } = "StringProperty";
    
    public void Test()
    {
        // Public DIM members are available via cast
        ((IDerived)this).DerivedMethod();
    }

    // Protected DIM members can be overridden.
    // There doesn't seem to be a way to access the base method in the override.
    void IBase.BaseMethod(string param) => Console.WriteLine($"Foo.BaseMethod: {param}");
}

夏普实验室

于 2021-10-29T07:49:57.253 回答