可空的通用对象集合

时间:2015-09-04 20:56:23

标签: c# object generics types nullable

public class CubicMatrix<Object?>
    {
        private int width;
        private int height;
        private int depth;
        private Object[, ,] matrix;

        public CubicMatrix(int inWidth, int inHeight, int inDepth)
        {
            width = inWidth;
            height = inHeight;
            depth = inDepth;
            matrix = new Object[inWidth, inHeight, inDepth];
        }

        public void Add(Object toAdd, int x, int y, int z)
        {
            matrix[x, y, z] = toAdd;
        }

        public void Remove(int x, int y, int z)
        {
            matrix[x, y, z] = null;
        }

        public void Remove(Object toRemove)
        {
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    for (int z = 0; z < depth; z++)
                    {
                        Object value = matrix[x, y, z];
                        bool match = value.Equals(toRemove);
                        if (match == false)
                        {
                            continue;
                        }

                        matrix[x, y, z] = null;
                    }
                }
            }
        }

        public IEnumerable<Object> Values
        {
            get
            {
                LinkedList<Object> allValues = new LinkedList<Object>();
                foreach (Object entry in matrix)
                {
                    allValues.AddLast(entry);
                }
                return allValues.AsEnumerable<Object>();
            }
        }

        public Object this[int x, int y, int z]
        {
            get
            {
                return matrix[x, y, z];
            }
        }

        public IEnumerable<Object> RangeInclusive(int x1, int x2, int y1, int y2, int z1, int z2)
        {
            LinkedList<Object> list = new LinkedList<object>();
            for (int a = x1; a <= x2; a++)
            {
                for (int b = y1; b <= y2; b++)
                {
                    for (int c = z1; c <= z2; c++)
                    {
                        Object toAdd = matrix[a, b, c];
                        list.AddLast(toAdd);
                    }
                }
            }

            return list.AsEnumerable<Object>();
        }

        public bool Available(int x, int y, int z)
        {
            Object toCheck = matrix[x, y, z];
            if (toCheck != null)
            {
                return false;
            }

            return true;
        }
    }

我在C#中创建了一个Cubic Matrix类,用于存储3个维度的项目。我需要能够添加和删除项目,这就是我使用Object的原因吗? (我已经明白你不能使用可空的泛型,即T?)。然而,这种方法会产生错误

  

类型参数声明必须是标识符而不是类型

如果我不使用Object?虽然只是使用Object或T我得到此错误

  

无法将null转换为类型参数&#39; T&#39;因为它可能是一个不可为空的值类型。考虑使用&#39;默认(T)&#39;代替。

在这种情况下使用的正确语法和方法是什么?

3 个答案:

答案 0 :(得分:3)

如果您想将通用类型仅限于对象 - 即没有结构或简单类型 - 您可以添加where子句

public class CubicMatrix<T> where T : class

这意味着T只能是一个类。

答案 1 :(得分:1)

我认为你想使用通用参数T。您正在制作一个简单的容器类,因此允许任何通用参数都有意义,无论它是否可为空。要修正错误,只需按照说明操作,然后使用default(T)代替null

错误是因为T可能是classstruct,而struct不能为空。因此,将类型为T的变量分配给null无效。当default(T)是类时,nullT;当T为结构时,import pandas as pd df = pd.DataFrame.from_csv(r'yourPathToCsv.csv') data_grouped = df.groupby(['col1','col2'])['colAmount'].sum().to_frame() 为默认值。

答案 2 :(得分:1)

当返回default(T)时(正如您收到的错误建议),引用类型将返回null,数字类型将返回0,您的自定义类将返回null }和nullables将返回System.Nullable<T>。有关详细信息,请参阅MSDN上的default Keyword in Generic Code (C# Programming Guide)