使用自动属性显式实现接口
是否有任何方法可以使用自动属性显式实现接口?例如,考虑以下代码:使用自动属性显式实现接口
namespace AutoProperties
{
interface IMyInterface
{
bool MyBoolOnlyGet { get; }
}
class MyClass : IMyInterface
{
static void Main(){}
public bool MyBoolOnlyGet { get; private set; } // line 1
//bool IMyInterface.MyBoolOnlyGet { get; private set; } // line 2
}
}
此代码编译。但是,如果将第1行替换为第2行,则不会进行编译。
(这并不是说我需要得到第2行的工作 - 我只是好奇。)
事实上,这种特定安排(通过自动实现的属性明确的实施只能获得界面属性)ISN”语言支持。所以要么手动(与一个领域),或写一个私人自动实施道具,并代理它。不过说实话,你的时间这样做,你还不如用一个场...
private bool MyBool { get;set;}
bool IMyInterface.MyBoolOnlyGet { get {return MyBool;} }
或:
private bool myBool;
bool IMyInterface.MyBoolOnlyGet { get {return myBool;} }
的问题是,该接口只有getter和你试着用getter和setter明确地实现它。
当你明确地实现一个接口时,只有当你引用if的接口类型时才会调用显式实现,所以......如果接口只有getter,那么就没有办法使用setter,所以没有办法使用setter二传手。
这一点,例如将编译:
namespace AutoProperties
{
interface IMyInterface
{
bool MyBoolOnlyGet { get; set; }
}
class MyClass : IMyInterface
{
static void Main() { }
bool IMyInterface.MyBoolOnlyGet { get; set; }
}
}
我看不到这个解释了为什么显式实现接口应该比隐式实现更受限制。如果C#编译器中的隐式实现结果自动为您生成必要的显式实现代码,那么这可能是有意义的。你能否在这里弥合逻辑上的差距 - 究竟是什么使隐含的不同于明确的,打破了OP的代码? – binki 2015-01-28 21:28:49
假设你可以在一个明确的实现中定义这样的私有setter。你会如何使用它? 'this.setter = ...'将委托给隐式设置器(因为这是MyClass类型)和'((IMyInterface)this).setter'将失败,因为IMyInterface没有定义setter。 – 2015-01-29 04:48:42
这就是整个问题。如果显式实现的属性可以自动实现,那么我不必手动实现自己的后备存储。我也可以依靠界面来定义一个getter来隐藏我的私人setter。那么,我猜想有问题,但在我看来,它基本上与[无法仅覆盖属性的setter或getter]相同的问题(http://stackoverflow.com/a/6058526/429091)。你应该能够告诉编译器,只是你的setter或者只是你的getter正在实现显式接口。 – binki 2015-01-29 15:00:43
你得到哪些错误? – 2010-10-11 09:36:03
对于“为什么” - 问问自己......我将如何分配它? – 2010-10-11 09:44:39
我得到两个错误: 1.'AutoProperties.MyClass.AutoProperties.IMyInterface.MyBoolOnlyGet.set'添加在接口成员'AutoProperties.IMyInterface.MyBoolOnlyGet'中找不到的访问器。 2.修饰符'private'对这个项目无效 – user181813 2010-10-12 05:37:27