【发布时间】:2017-06-30 09:59:28
【问题描述】:
请参阅下面的代码。 Visual Studio 2017 告诉我 IGetSet.Value 隐藏了 IGet.Value 属性,如果有意,我应该添加 new 关键字。我理解关于类隐藏属性的概念,但是当涉及到接口时,我看不到消息的重点。我是否添加 new 关键字当然在行为上没有区别。
我想要这 2 个接口的堆叠,因为我想要实现读写接口的对象在只允许获取值的方法中使用。
现在我的问题是:
- 这是实现我想要的方式吗?我将“隐藏”属性的消息视为一个信号,即“您正在这里做一些您可能不想做的事情,请尝试以不同的方式解决它”。
-
一个接口如何隐藏另一个接口的属性?它不依赖于接口的实现吗?那么为什么是消息呢?
public interface IGetSet : IGet { new string Value { get; set; } } public interface IGet { string Value { get; } } public class Tester : IGetSet { public string Value { get; set; } } [Test] public void InterfaceTest() { IGetSet tester = new Tester(); tester.Value = "My Value"; IGet getteronly = tester; var value = getteronly.Value; }
如果我尝试使用下面的代码解决它,我会收到此编译错误“CS0229 Ambiguity between 'IGet.Value' and 'ISet.Value'”
public interface ISet
{
string Value { set; }
}
public interface IGet
{
string Value { get; }
}
public interface IGetSet : IGet, ISet
{
}
【问题讨论】:
-
@Evk3 这只发生在隐式实现接口并且在代码中使用该属性时。使用行导致编译错误。感谢您指出了这一点。当代码中没有使用该属性时,虽然实现了接口,但代码确实可以编译。感谢您指出这一点!