在C#中,结构是值类型,接口和类都是引用类型。那么,为什么struct不能继承一个类,但它可以继承一个接口?
class a { }
public struct MyStruct : a //This will not be allowed.
{
}
interface a { }
public struct MyStruct : a // and this will work
{
}
答案 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
之上构造的引用类型。
对于开始表现得像引用类型的值类型,存在性能影响以及误导性行为(如本例中)。
有关此主题的更多信息,请查看:
答案 1 :(得分:0)
接口不是值或引用类型。实际上我相信它是唯一一个继承自.Net框架中Object对象类型的构造。
请参阅MSDN Link