可以在显式接口实现中引用同名的隐式属性吗?

时间:2009-03-16 15:27:46

标签: c# explicit-interface

假设我有一个实现字符串类型属性的类型:

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”属性中的表达式具有“字符串值”“值”属性。如果它是另一个显式实现的接口成员,我可以对该接口进行类型转换然后使用,但它对隐式类型成员有什么作用?

注意:这个例子有点人为,但希望能够证明语言问题。

4 个答案:

答案 0 :(得分:3)

对于隐式类型成员,只需Valuethis.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不是接口变量,因此隐式属性是默认选择的属性。