C# 显式接口实现,为什么显式转换
当类显式实现接口时,为什么需要显式地将类实例转换为接口以使用实现的方法 (此示例取自此处:) 您有两个接口,如下所示C# 显式接口实现,为什么显式转换,c#,C#,当类显式实现接口时,为什么需要显式地将类实例转换为接口以使用实现的方法 (此示例取自此处:) 您有两个接口,如下所示 interface IControl { void Paint(); } interface ISurface { void Paint(); } 你可以显式地实现它们 public class SampleClass : IControl, ISurface { void IControl.Paint() { System.Co
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
你可以显式地实现它们
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
现在,要使用这些接口,您需要以下代码
// Call the Paint methods from Main.
SampleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.
IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.
ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.
在上面的代码块中,为什么有
IControl c = (IControl)obj;
IControl c = (IControl)obj;
相对于
IControl c = obj;
IControl c = obj;
?
我感到困惑的原因是,例如,您可以执行以下操作
IDictionary<string, string> c = new Dictionary<string, string>();
IDictionary c=new Dictionary();
没有显式地将新词典
转换为IDictionary
谢谢。只有当类型从多个接口继承并且某些方法在多个接口中具有相同的名称/签名时,才需要显式接口实现 其余的则是偏好和惯例的问题
mpleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.
obj.Paint()
-->这是一个错误,因为当显式接口实现完成时,底层接口实现要求按照中的指定进行显式转换
在方法调用、属性访问或索引器访问中,无法通过完全限定名访问显式接口成员实现。显式接口成员实现只能通过接口实例访问,在这种情况下,仅通过其成员名称引用
当类显式实现接口时,为什么需要显式地将类实例转换为接口才能使用实现的方法
就编译器而言,该成员实际上并不存在于类上——它只存在于接口上。不过,您不必显式强制转换,只需要有一个具有编译时类型接口的引用。这可以任意完成,包括隐式转换
在上面的代码块中,为什么有
IControl c = (IControl)obj;
IControl c = (IControl)obj;
相对于
IControl c = obj;
IControl c = obj;
你不必这么做。隐式转换应该是绝对正确的。为了在单个表达式中调用该方法,必须显式强制转换,例如
obj.Paint(); // Invalid
((IControl) obj).Paint(); // Valid
但是,如果您通过赋值到接口类型的单独局部变量进行隐式转换,这很好-该方法仍在使用接口类型的目标表达式调用。因为否则它如何知道使用哪个隐式实现?也可能是!这应该可以-不需要强制转换。@Liam,左边是
IControl c
,这还不够吗?隐式转换很好。如果使用隐式类型的局部变量(var关键字),则只需要显式强制转换;如果您在某些地方使用它,可能会导致一些混淆。MSDN使用问题IControl c=(IControl)obj代码>。为什么他们使用冗余的显式转换进行隐式转换?这一定是一个粗心的错误,或者是为了可读性而存在的。这似乎回答了一个不同的问题——即显式接口实现的目的是什么。它没有回答实际被问到的问题,所以你是说如果我有一个对象MyClass o=newmyclass()代码>明确实现了一个接口,但我不能这样做。o.InterfaceMethod()
;但是如果它是IInterface o=newMyClass()代码>那就行了。我说得对吗?这里值得注意的是,在C#中,可以通过implict()和explicit()操作符重载来控制隐式和显式强制转换