【问题标题】:Can one reference a same-named implicit property in an explicit Interface implementation?可以在显式接口实现中引用同名的隐式属性吗?
【发布时间】:2009-03-16 15:27:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# explicit-interface


    【解决方案1】:

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

    【讨论】:

    • 所以编译器会自动执行我认为我必须手动执行的操作。 sigh 不过,我想这不是一个损失,因为现在一些新的 C# 已经在我的大脑中点击了。谢谢!
    【解决方案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 { }
      }
    }
    

    【讨论】:

    • 在我的模拟示例中,“public”只是一个错误类型,但 +1 指出了区别(我之前已经掩盖了)
    【解决方案3】:

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

    Record myInstanceAsRecord = myInstance;
    IIntValued myInstanceAsIIntValued = myinstance;
    
    string valueAsString = myInstanceAsRecord.Value;
    int valueAsInt = myInstanceAsIIntValued.Value;
    

    【讨论】:

      【解决方案4】:

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

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

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

      string value = this.Value;
      

      本来可以的。当然,这是因为this 不是接口变量,因此默认情况下会选择隐式属性。

      【讨论】:

        猜你喜欢
        • 2018-02-08
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2010-10-10
        相关资源
        最近更新 更多