2013-08-10 4 views
0

Я пытаюсь написать код для XNA, чтобы иметь свои собственные модули чертежа, которые я могу использовать для кэширования/рисования статических вершин/индексов.Есть ли способ указать возможные типы для общего класса?

Here's the class, линия в вопросе, который дает мне неприятности является линия 51.

_vertexBuffer.SetData(_vertices.ToArray()); 

Она имеет ошибку: The type 'T' must be a non-nullable value type in order to use it as parameter 'T'

Это, кажется, не нравится, как SetData обычно ожидает массив Вершины, которые соответствуют VertexDeclaration, используемым в конструкторе VertexBuffers, в то время как мое определение класса/класса говорит, что это может быть любой тип.

Есть ли способ указать <T> как вершины?

+1

Не ссылайтесь на внешний сайт для соответствующего кода. См. Http://meta.stackexchange.com/a/89309 –

+0

Если 'SetData' ожидает определенного типа, зачем делать свой класс общим? Не можете ли вы использовать этот конкретный тип (или его базу) вместо 'T'? – dasblinkenlight

+0

@dasblinkenlight Я пробовал это, но у меня все еще была такая же ошибка. Даже если я делаю 'где T: IVertexType', он не работает, поскольку' SetData' ожидает 'struct'. – MatthewMcGovern

ответ

2

Их называют generic type constraints. Вне зависимости от VertexBuffer типа, то есть это в этом методе:

void SetData<T>(...) where T : struct 

Это то, что вызывает у вас ошибку.

На самом деле, MSDN говорит, что это метод подписи:

public void SetData<T> (
    T[] data 
) where T : ValueType 

Который по существу то же самое.

Итак, чтобы исправить это, вам необходимо передать массив элементов, которые являются типами значений, а не ссылочными типами. То есть, ваш экземпляр DrawModule<T> должен быть DrawModule<ValueTypeHere>.

+0

Довольно странно, что [страница документа MSDN] (http://msdn.microsoft.com/en-us/library/bb198836.aspx) не получила синтаксис ограничений на вкладке C# в «поле кода». На других страницах они записывают 'где T: struct', что является правильным способом в C#. –

+0

Действительно. Компилятор не допустил бы использование 'ValueType', я бы не подумал (я не помню, чтобы это было законным). –

+0

Вот еще [страница документа из той же сборки] (http://msdn.microsoft.com/en-us/library/ff434115.aspx), и они используют 'T: struct' там! –

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