为什么不能隐式实现非 public 接口成员?
Why cannot implicitly implement a non-public interface member?
接口:
interface IMyInterface{
internal int Property {get; set;}
}
Class:
public class MyClass: IMyInterface{
internal int Property {get; set;}
}
结果:
CS8704 错误:MyClass 未实现接口成员 Property.get MyClass 无法隐式实现非 public 成员。
为什么我必须显式实现接口?
接口成员没有像 public 或内部这样的作用域。你这里有一个 default interface implementation.
所以你需要移除界面上的作用域:
interface IMyInterface{
int Property {get; set;}
}
对于“为什么是这样的语言”的简单回答是“因为语言设计者就是这样指定的”。
那么,他们为什么要这样设计呢?我找到的一些官方注释是 these。似乎主要问题是关于实现者必须具有什么样的访问权限:
Would we allow non-public interface members to be implemented implicitly? If so, what is required of the accessibility of the implementing method? Some options:
- Must be public
- Must be the exact same accessibility
- Must be at least as accessible
他们决定:
For now, let's simply not allow it. Only public interface members can be implicitly implemented (and only by public members).
“目前”从未改变,因此从 C# 8 开始,接口可以具有非 public 虚拟成员,但 class 只能显式实现它们。
我可以推测他们可能决定反对隐式覆盖的几个原因:
- 接口中的非public虚方法可能被认为是“稀有”特性(毕竟,接口不应该记录class的public行为吗? ?),不值得在隐式覆盖的语义方面投入大量资源。
- 与 class-to-class 继承中的方法覆盖不同,实现接口方法的 class 方法不使用
override
关键字。看到受保护的 and/or 内部方法而没有意识到它正在履行接口契约,可能会让人感到困惑。 (Public 方法可能被认为不受此问题的影响,因为它们一直都是这样工作的,并且 public 方法无论如何都是 class' public 契约的一部分,因此修改/ 删除它们已经导致 reader 考虑依赖于它的代码的其他部分。)
- 接口只能显式覆盖其他接口方法,这可能又是因为允许接口到接口的隐式实现对编译器和工具团队来说成本太高,对 C# 用户来说太混乱。 (特别是因为接口到接口的继承是多重继承。)由于 this 和非 public 接口方法都是在 C# 8 中普遍引入的,因此使这两个功能在语法上匹配可能是有意义的。
另见 notes on this question in the default interface method proposal。
内部 属性 强制实现是显式的,这样接口的内部成员将保留在程序集内部。
它可以帮助您将实现保持在内部(对于程序集),以便您可以更新代码而不会破坏更改,例如重命名 属性.
interface IMyInterface
{
internal int Property { get; set; }
}
public class MyClass : IMyInterface
{
int IMyInterface.Property { get; set; }
}
接口:
interface IMyInterface{
internal int Property {get; set;}
}
Class:
public class MyClass: IMyInterface{
internal int Property {get; set;}
}
结果: CS8704 错误:MyClass 未实现接口成员 Property.get MyClass 无法隐式实现非 public 成员。
为什么我必须显式实现接口?
接口成员没有像 public 或内部这样的作用域。你这里有一个 default interface implementation.
所以你需要移除界面上的作用域:
interface IMyInterface{
int Property {get; set;}
}
对于“为什么是这样的语言”的简单回答是“因为语言设计者就是这样指定的”。
那么,他们为什么要这样设计呢?我找到的一些官方注释是 these。似乎主要问题是关于实现者必须具有什么样的访问权限:
Would we allow non-public interface members to be implemented implicitly? If so, what is required of the accessibility of the implementing method? Some options:
- Must be public
- Must be the exact same accessibility
- Must be at least as accessible
他们决定:
For now, let's simply not allow it. Only public interface members can be implicitly implemented (and only by public members).
“目前”从未改变,因此从 C# 8 开始,接口可以具有非 public 虚拟成员,但 class 只能显式实现它们。
我可以推测他们可能决定反对隐式覆盖的几个原因:
- 接口中的非public虚方法可能被认为是“稀有”特性(毕竟,接口不应该记录class的public行为吗? ?),不值得在隐式覆盖的语义方面投入大量资源。
- 与 class-to-class 继承中的方法覆盖不同,实现接口方法的 class 方法不使用
override
关键字。看到受保护的 and/or 内部方法而没有意识到它正在履行接口契约,可能会让人感到困惑。 (Public 方法可能被认为不受此问题的影响,因为它们一直都是这样工作的,并且 public 方法无论如何都是 class' public 契约的一部分,因此修改/ 删除它们已经导致 reader 考虑依赖于它的代码的其他部分。) - 接口只能显式覆盖其他接口方法,这可能又是因为允许接口到接口的隐式实现对编译器和工具团队来说成本太高,对 C# 用户来说太混乱。 (特别是因为接口到接口的继承是多重继承。)由于 this 和非 public 接口方法都是在 C# 8 中普遍引入的,因此使这两个功能在语法上匹配可能是有意义的。
另见 notes on this question in the default interface method proposal。
内部 属性 强制实现是显式的,这样接口的内部成员将保留在程序集内部。 它可以帮助您将实现保持在内部(对于程序集),以便您可以更新代码而不会破坏更改,例如重命名 属性.
interface IMyInterface
{
internal int Property { get; set; }
}
public class MyClass : IMyInterface
{
int IMyInterface.Property { get; set; }
}