MonoGame/MonoGame · error · ArgumentException

Type '{newBitmapType}' is abstract and cannot be allocated.

Error message

Type '{newBitmapType}' is abstract and cannot be allocated.

What it means

Thrown by TextureContent.ConvertBitmapType(Type) when the supplied type is abstract. ConvertBitmapType calls Activator.CreateInstance to allocate new bitmap instances, which requires a concrete (instantiable) type. Abstract BitmapContent subclasses like the PvrtcBitmapContent base class itself cannot be allocated and will fail here.

Source

Thrown at MonoGame.Framework.Content.Pipeline/Graphics/TextureContent.cs:40

        /// <param name="faces">Mipmap chain containing the face collection.</param>
        protected TextureContent(MipmapChainCollection faces)
        {
            Faces = faces;
        }

        /// <summary>
        /// Converts all bitmaps for this texture to a different format.
        /// </summary>
        /// <param name="newBitmapType">Type being converted to. The new type must be a subclass of BitmapContent, such as PixelBitmapContent or DxtBitmapContent.</param>
        public void ConvertBitmapType(Type newBitmapType)
        {
            ArgumentNullException.ThrowIfNull(newBitmapType);

            if (!newBitmapType.IsSubclassOf(typeof (BitmapContent)))
                throw new ArgumentException($"Type '{newBitmapType}' is not a subclass of BitmapContent.", nameof(newBitmapType));

            if (newBitmapType.IsAbstract)
                throw new ArgumentException($"Type '{newBitmapType}' is abstract and cannot be allocated.", nameof(newBitmapType));

            if (newBitmapType.ContainsGenericParameters)
                throw new ArgumentException($"Type '{newBitmapType}' contains generic parameters and cannot be allocated.", nameof(newBitmapType));

            if (newBitmapType.GetConstructor([typeof (int), typeof (int)]) == null)
                throw new ArgumentException($"Type '{newBitmapType} does not have a constructor with signature (int, int) and cannot be allocated.", nameof(newBitmapType));

            foreach (var mipChain in Faces)
            {
                for (var i = 0; i < mipChain.Count; i++)
                {
                    var src = mipChain[i];
                    if (src.GetType() != newBitmapType)
                    {
                        var dst = (BitmapContent)Activator.CreateInstance(newBitmapType, src.Width, src.Height)!;
                        BitmapContent.Copy(src, dst);
                        mipChain[i] = dst;
                    }

View on GitHub (pinned to 1d71bbd0ff)

Solutions

  1. Use a concrete (non-abstract) subclass: for PVRTC use the specific format type, for standard use PixelBitmapContent<Color>, Dxt1BitmapContent, Dxt3BitmapContent, or Dxt5BitmapContent
  2. Check type.IsAbstract before calling ConvertBitmapType and choose a concrete alternative
  3. Review the class hierarchy — ensure the target type has no abstract keyword

Example fix

// before
texture.ConvertBitmapType(typeof(PvrtcBitmapContent)); // abstract

// after
// Use a concrete DXT or pixel format instead
texture.ConvertBitmapType(typeof(Dxt5BitmapContent));
Defensive patterns

Strategy: type-guard

Validate before calling

// Ensure the type is concrete (not abstract)
if (newBitmapType.IsAbstract)
    throw new ArgumentException($"{newBitmapType} is abstract; use a concrete subclass");
texture.ConvertBitmapType(newBitmapType);

Type guard

static bool IsConcreteBitmapType(Type t) => t.IsSubclassOf(typeof(BitmapContent)) && !t.IsAbstract;

Prevention

When it happens

Trigger: Calling texture.ConvertBitmapType(typeof(PvrtcBitmapContent)) or any other abstract BitmapContent subclass. PvrtcBitmapContent is declared as 'public abstract class', so passing it directly fails this check — you must use one of its concrete subclasses.

Common situations: Passing the PvrtcBitmapContent base class instead of a concrete PVRTC format subclass; using a custom abstract bitmap base; passing an interface type that happens to satisfy IsSubclassOf via a concrete hierarchy.

Related errors


AI-assisted analysis of MonoGame/MonoGame@1d71bbd0ff (2026-08-13). Data as JSON: /api/errors/17d32d197d0146fd. Report an issue: GitHub.