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指出了区别(我之前已经掩盖了这一点)