为什么i
可以致电Method
?它无法看到Method
的实施,只有声明,不是吗?它同时是upcast和拳击..还是没有?
interface IB
{
void Method();
}
struct A : IB
{
public void Method() { Console.WriteLine("1"); }
}
class Program
{
static void Main()
{
A a;
a.Method();
IB i = a; // boxing.. and upcast?
i.Method(); // why it works? It looks like call of declaration
}
}
工作结果:
1
1
答案 0 :(得分:1)
看起来您正在创建A的实例,然后在A中调用方法,然后将IB(i)声明为A的实例并再次调用其方法
答案 1 :(得分:1)
当您将对象分配给接口i
的实例时,您只是隐藏a
对象中与接口定义不匹配的任何其他内容。
相反,我们假设你的结构是
struct A : IB
{
public void Method() { Console.WriteLine("1"); } // Method defined in interface IB.
public void Method2() { Console.WriteLine("2"); } // Method only in A
}
class Program
{
static void Main()
{
A a;
a.Method();
a.Method2(); // This works.
IB i = a;
i.Method();
i.Method2();// This fails to compile because Method2 isnt defined in the interface.
}
}
答案 2 :(得分:1)
类A
的实例实现接口IB
,也就是说,类A
的任何实例也是接口IB
的类型,因此它是完全合法的将A
的对象分配给IB
。没有铸造。没拳击。是的,正如@CathalMF所说,你只能从这个对象中调用IB
接口中的内容。