为什么在结构上允许接口继承,为什么不能继承类

时间:2013-12-17 08:25:05

标签: c# inheritance interface reference

在C#中,结构是值类型,接口和类都是引用类型。那么,为什么struct不能继承一个类,但它可以继承一个接口?

class a { }
public struct MyStruct : a //This will not be allowed.
{

}

interface a { }
public struct MyStruct : a  // and this will work
{

}

2 个答案:

答案 0 :(得分:11)

Interface本身不是引用或值类型。 Interface合同,其引用或值类型订阅。

您可能会提到一个事实,即从struct继承的interface已装箱。 是。这是因为在C#中,struct成员的定义类似于virtual成员。并为 您需要维护虚拟成员的虚拟成员,因此您需要一个引用类型。

让我们按照以下方式证明这一点:

public interface IStruct {
     string Name {get;set;}
}

public struct Derived : IStruct {
     public string Name {get;set;}
}

现在,让我们这样称呼它:

//somewhere in the code
public void ChangeName(IStruct structInterface) {
     structInterface.Name = "John Doe";
}

//and we call this function as 

IStruct inter = new Derived();
ChangeName(inter); 

//HERE NAME IS CHANGED !!
//inter.Name  == "John Doe";

这不是我们对值类型的期望,但是完全作为引用类型工作。所以在这里发生的是,Derived的值类型实例是盒装IStruct之上构造的引用类型。

对于开始表现得像引用类型的值类型,存在性能影响以及误导性行为(如本例中)。

有关此主题的更多信息,请查看:

C#: Structs and Interface

答案 1 :(得分:0)

接口不是值或引用类型。实际上我相信它是唯一一个继承自.Net框架中Object对象类型的构造。

请参阅MSDN Link