2015-09-04 6 views
1
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; 
     } 
    } 

Я создал класс Cubic Matrix в C# для хранения предметов в 3-х измерениях. Мне нужно иметь возможность добавлять и удалять элементы, поэтому я использую Object? (Я был убежден, что вы не можете использовать генерируемые нулями генераторы, т. Е. T?). Однако такой подход gnerates ошибкаОбнаруживаемый набор общих объектов

объявление параметра типа должно быть идентификатором не тип

Если я не использую объект? хотя и просто используйте Object или T, я получаю эту ошибку вместо этого.

Невозможно преобразовать значение null в тип параметра 'T', потому что это может быть тип значения, не равный nullable. Вместо этого используйте «default (T)».

Каков правильный синтаксис и подход к использованию в этом случае?

+0

Есть несколько возможных решений здесь: http://stackoverflow.com/questions/19831157/c-sharp-generic-type-constraint-for-everything-nullable –

ответ

1

Я думаю, вы хотите использовать общий параметр T. Вы создаете простой класс контейнеров, поэтому разрешение любого общего параметра имеет смысл, независимо от того, является оно нулевым или нет. Чтобы исправить ошибку, просто сделайте то, что она говорит, и используйте default(T) вместо null.

Ошибка в том, что T может быть class или struct, а struct s не может быть пустым. Поэтому присваивание переменной типа T - null недействительно. default(T) - null, когда T - это класс и значения по умолчанию, когда T является структурой.

1

При возврате default(T) вместо (как ошибка вы получаете предлагает), ссылочные типы будут возвращать null, числовые типы будут возвращать 0, пользовательские классы будут возвращать null и nullables вернется System.Nullable<T>. Подробнее об этом в default Keyword in Generic Code (C# Programming Guide) на MSDN.

3

Если вы хотите ограничить общий тип только объекты - то есть нет или простые Структуры типа - вы можете добавить Оговорка where

public class CubicMatrix<T> where T : class 

Эти средства, которые могут быть T только класс.

+0

Это не верно, структуры удовлетворяют [ 'новые() '] (https://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx). [Пример компиляции] (http://ideone.com/hf56HY). Вероятно, вы ищете ограничение класса. – 31eee384

+0

@ 31eee384 вы правы - спасибо, я обновил ответ. –

+1

Использование ограничения объекта генерирует ошибку _Constraint не может быть специальным классом 'object'_ Но используя, где работает ограничение класса T: class. Спасибо за помощь. – Darkreaper

Смежные вопросы