Skip to main content
 首页 » 编程设计

c#之可为空的通用对象集合

2024年01月31日27三少

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 个维度的项目。我需要能够添加和删除项目,这就是我使用对象的原因? (我被引导理解你不能使用可为空的泛型,即 T?)。但是这种方法会产生错误

Type parameter declaration must be an identifier not a type

如果我不使用对象呢?虽然只是使用 Object 或 T 我得到了这个错误

Cannot convert null to type parameter 'T' because it could be a non-nullable value type. Consider using 'default(T)' instead.

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

请您参考如下方法:

如果您只想将泛型类型限制为对象 - 即没有结构或简单类型 - 您可以添加 where 子句

public class CubicMatrix<T> where T : class 

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