假设我有一个实现字符串类型属性的类型:
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{}
}
}
但是,如果我希望能够在显式界面中引用字符串“Value”,我可以这样做吗?如果是这样,怎么样?我想它会是这样的:
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”属性中的表达式具有“字符串值”“值”属性。如果它是另一个显式实现的接口成员,我可以对该接口进行类型转换然后使用,但它对隐式类型成员有什么作用?
注意:这个例子有点人为,但希望能够证明语言问题。
答案 0 :(得分:3)
对于隐式类型成员,只需Value
或this.Value
即可 - 因为默认情况下它不会解析为IIntValued.Value
。
答案 1 :(得分:2)
当然可以!问题是您将可访问性关键字放在非法的位置。明确实现的成员不能拥有辅助功能关键字。隐式实现将与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 { }
}
}
答案 2 :(得分:1)
是的,您可以访问这两个属性。它取决于用于访问属性的变量的类型。观察:
Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;
string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;
答案 3 :(得分:0)
呃,在写完总结后,我意识到我知道答案。 :P
如果我使用this
并将其类型转换为类类型,则不会包含explict实现:
string value = ((Record)this).Value; //is the implicit string.
编辑:经过一些进一步的输入(感谢响应者!)后,有人指出没有必要手动执行编译器自动执行的操作。因此:
string value = this.Value;
会起作用。当然,这是因为this
不是接口变量,因此隐式属性是默认选择的属性。