部分嵌套结构不会被继承

时间:2017-01-13 07:33:52

标签: c#

public class Base<T>
{
    T _data;

    public partial struct Data
    {
        public T _data;
    }
}

public class Custom : Base<int>
{
    public partial struct Data
    {
        public float _bla;
        public bool _bla2;
    }

    public void BlaBla()
    {
        Data data = new Data();

        //int data = data._data; <= NOT FOUND
        float bla = data._bla;
        bool bla2 = data._bla2;
    }
}

如上所述,Data类在父类和子类中定义了两次。

此外,Custom还根据需要定义了其他成员变量。

但是,无法访问Base中的Data._data。

... 为什么会这样?

3 个答案:

答案 0 :(得分:4)

部分类只是msil中的语法糖,没有部分类。在这种情况下,您将创建2个不同的类。您没有Data类型,类型为Custom.DataBase<T>.Data

    Console.WriteLine(typeof(Custom.Data));
    Console.WriteLine(typeof(Base<string>.Data));

enter image description here

答案 1 :(得分:3)

  

Data类在父类和子类

中定义了两次

完全。您有两种不同的类型,其名称以Data结尾,但它们没有任何关系。

来自C#规范:

  

部分类型声明的每个部分都必须包含部分修饰符。它必须具有相同的名称,并在与其他部分相同的命名空间或类型声明中声明为

因为它们以不同的类型嵌套,所以它们本身就是不同的类型。 partial修饰符在这方面没有任何作用;它们只是由一部分组成的部分类型。

答案 2 :(得分:2)

请参阅@CodeCaster和@Max Mokrousov的其他答案。

这是一种通过从基础Data类继承而获得所需结果的方法:

public class Base<T>
{
    T _data;

    public class Data // Note that it's a class now instead of a struct
    {
        public T _data;
    }
}

public class Custom : Base<int>
{
    public class DataCustom : Base<int>.Data
    {
        public float _bla;
        public bool _bla2;
    }

    public void BlaBla()
    {
        DataCustom data = new DataCustom();

        int dataBase = data._data; // now works
        float bla = data._bla;
        bool bla2 = data._bla2;
    }
}