1

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

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 valued”“Value”属性中的表达式的“string valued”“Value”属性。如果它是另一个显式实现的接口成员,我可以类型转换为该接口然后使用,但它如何用于隐式类型成员?

注意:这个例子有点做作,但希望能演示语言问题。

4

4 回答 4

3

对于隐式类型成员,只是Valuethis.Value应该没问题 - 因为默认情况下它不会解析IIntValued.Value

于 2009-03-16T15:33:13.357 回答
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 { }
  }
}
于 2009-03-16T15:38:03.483 回答
1

是的,您可以访问这两个属性。这取决于用于访问属性的变量的类型。观察:

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;
于 2009-03-16T15:33:12.077 回答
0

呃,写完总结后,我意识到我知道答案了。:P 如果我将this其转换为类类型,则将不包括显式实现:

string value = ((Record)this).Value; //is the implicit string.

编辑:经过进一步的输入(感谢响应者!)有人指出,无需手动执行编译器自动执行的操作。因此:

string value = this.Value;

本来可以的。当然,这是因为this不是接口变量,所以隐式属性将是默认选择的那个。

于 2009-03-16T15:36:19.213 回答