GD0302: The generic type parameter must be annotated with the MustBeVariant attribute ===================================================================================== ==================================== ====================================== Value ==================================== ====================================== **Rule ID** GD0302 **Category** Usage **Fix is breaking or non-breaking** Breaking **Enabled by default** Yes ==================================== ====================================== Cause ----- A generic type is specified for a generic type argument when a :ref:`Variant-compatible ` type is expected, but the specified generic type is not annotated with the ``[MustBeVariant]`` attribute. Rule description ---------------- When a generic type parameter is annotated with the ``[MustBeVariant]`` attribute, the generic type is required to be a Variant-compatible type. When the type used is also a generic type, this generic type must be annotated with the ``[MustBeVariant]`` attribute as well. For example, the generic ``Godot.Collections.Array`` type only supports items of a type that can be converted to Variant, a generic type can be specified if it's properly annotated. .. code-block:: csharp public void Method1() { // T is not valid here because it may not a Variant-compatible type. var invalidArray = new Godot.Collections.Array(); } public void Method2<[MustBeVariant] T>() { // T is guaranteed to be a Variant-compatible type because it's annotated // with the [MustBeVariant] attribute, so it can be used here. var validArray = new Godot.Collections.Array(); } How to fix violations --------------------- To fix a violation of this rule, add the ``[MustBeVariant]`` attribute to the generic type that is used as a generic type argument that must be Variant-compatible. When to suppress warnings ------------------------- Do not suppress a warning from this rule. API that contains generic type arguments annotated with the ``[MustBeVariant]`` attribute usually has this requirement because the values will be passed to the engine, if the type can't be marshalled it will result in runtime errors.