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

C# 可以在显式接口实现中引用相同的命名隐式属性吗?,c#,explicit-interface,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 Valu

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

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


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

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

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;

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

Record myInstanceAsRecord = myInstance;
IIntValued myInstanceAsIIntValued = myinstance;

string valueAsString = myInstanceAsRecord.Value;
int valueAsInt = myInstanceAsIIntValued.Value;

对于隐式类型成员,只需
Value
this.Value
就可以了-因为默认情况下它不会解析为
IIntValued.Value

对于隐式类型成员,只要
Value
this.Value
就可以了-因为默认情况下它不会解析为
IIntValued.Value

啊,在写了总结之后,我意识到我知道答案了P 如果我使用
这个
并将其类型转换为类类型,那么将不包括显式实现:

string value = ((Record)this).Value; //is the implicit string.
编辑:在进一步输入之后(感谢响应者!)有人指出,不需要手动执行编译器自动执行的操作。因此:

string value = this.Value;

那就行了。当然,这是因为
This
不是接口变量,因此隐式属性将是默认选择的属性

啊,在写了总结之后,我意识到我知道答案了:P 如果我使用
这个
并将其类型转换为类类型,那么将不包括显式实现:

string value = ((Record)this).Value; //is the implicit string.
编辑:在进一步输入之后(感谢响应者!)有人指出,不需要手动执行编译器自动执行的操作。因此:

string value = this.Value;

那就行了。当然,这是因为
This
不是接口变量,因此隐式属性将是默认选择的属性

当然可以!问题是您将可访问性关键字放置在非法的位置。显式实现的成员不能具有可访问性关键字。隐式实现的函数将在不输出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 { }
  }
}

当然可以!问题是您将可访问性关键字放置在非法的位置。显式实现的成员不能具有可访问性关键字。隐式实现的函数将在不输出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 { }
  }
}

因此,编译器会自动执行我认为必须手动执行的操作。唉,我想这并不是一个损失,因为现在一些新的C#已经在我的大脑中点击。谢谢因此,编译器会自动执行我认为必须手动执行的操作。唉,我想这并不是一个损失,因为现在一些新的C#已经在我的大脑中点击。谢谢在我的模拟示例中,“public”只是一个错误的类型,但是+1指出了它的区别(我之前已经掩盖了这一点),“public”在我的模拟示例中只是一个错误的类型,但是+1指出了区别(我之前已经掩盖了这一点)