题
说我有一个实现属性具有字符串类型的类型:
public class Record
{
public string Value { get; set; }
}
然后我具有限定具有相同名称的属性的接口:
public interface IIntValued
{
public int Value { get; set; }
}
我可以使用显式的接口,如下所示:
public class Record : IIntValued
{
public string Value { get; set; }
int IIntValued.Value
{
get{ return 0; } set{}
}
}
不过,如果我希望能够引用字符串“值”在我的显式接口,能做些什么呢?如果是这样,怎么样?我想象它是这样的:
public class Record : IIntValued
{
public string Value { get; set; }
public int IIntValued.Value
{
get
{
string value = /*Magic here*/.Value;
return int.parse(value);
}
set{}
}
}
可以看到,我想“值”属性在一个表达式“INT值”,“值”属性的“值字符串”。如果它是另一个显式实现接口成员,我可以强制转换到该接口,然后使用,但它是如何将一个隐式类型成员的工作?
注意:这个例子是有点做作,但希望表明了语言问题
。解决方案
有关的隐含型部件,只是Value
或this.Value
要细。 - 因为它不会解决在默认情况下IIntValued.Value
其他提示
当然可以!问题是,你将可访问关键字,他们是非法的。明确实施的成员不能有无障碍关键字。隐式实现将与出IIntValue写入。前缀成员名称。
下面是一个可行的样品。
public interface IIntValued
{
int Value { get; set; }
}
public class Record : IIntValued
{
public string Value { get; set; }
int IIntValued.Value
{
get
{
string value = this.Value;
return int.Parse(value);
}
set { }
}
}
是的,你可以访问这两个属性。这取决于用于访问属性变量的类型。观察:
Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;
string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;
唉,写总结后,我意识到,我知道答案。 :P
如果我带this
和它类型强制转换为类型,则显式执行将不包括在内:
string value = ((Record)this).Value; //is the implicit string.
编辑:一些进一步的输入之后,将它指出,没有必要做手工的东西,编译器会自动做(感谢反应!)。因此:
string value = this.Value;
会工作。这是当然的,因为this
不是接口变量,所以隐含的属性将是默认选择的一个。
不隶属于 StackOverflow