2011-10-19 62 views
1

我正在編寫一個與XNA一起工作的庫。我有一個基本類的基類,我打算從中創建Planes,Cubes和其他原始類型。理想情況下,我希望我的基類執行渲染,而不管使用的頂點類型如何。在泛型基類中使用DrawUserIndexedPrimitives <>

相關代碼:

public abstract class Primitive<VT> where VT : IVertexType 
{ 
    private void Draw(GraphicsDevice graphics) 
    { 
      graphics.DrawUserIndexedPrimitives<VT>(primitiveType_, 
                vertices_, 
                0, 
                vertices_.Length, 
                indices_, 
                0, 
                primitiveCount_); 
    }  
} 

現在,其他類不是源於此,使用適當的頂點類型:

public abstract class Plane<VT> : Primitive<VT> where VT : IVertextTpye { ... } 
public class PlaneColored : Primitive<VertexPositionColor> { .... } 
public class PlaneTextured : Primitive<VertexPositionTexture> { .... } 

的問題是,我得到了DrawUserIndexPrimitives <編譯錯誤>電話:

Error 1 The type 'VT' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Microsoft.Xna.Framework.Graphics.GraphicsDevice.DrawUserIndexedPrimitives<T>(Microsoft.Xna.Framework.Graphics.PrimitiveType, T[], int, int, short[], int, int)' C:\dev\Projects\2010\XNAParts\XNAParts\Parts\Primitive.cs 88 

而且我不能將構造更改爲struct否則DrawUserIndexPrimitives的泛型參數將不起作用(因爲它不是結構體)。

有沒有解決這個辦法嗎?

在此先感謝!

+0

一個很好的問題,但標題並沒有描述空值約束的真正問題 –

回答

1

如何更改Primitive要求VT是一個結構?

public abstract class Primitive<VT> where VT : struct, IVertexType 

,同樣

public abstract class Plane<VT> : Primitive<VT> where VT : struct, IVertexType 

你聲稱「DrawUserIndexPrimitives泛型參數是不行的(因爲它不是一個結構)」,但目前還不清楚你的意思是什麼。哪個參數?我嫌疑人以上是你想要的,但它不是很清楚。

+0

感謝這一點,我完全忘了可以同時使用struct和IVertextType! –

相關問題