GD0111: The exported tool button must be an expression-bodied property ====================================================================== ==================================== ====================================== Value ==================================== ====================================== **Rule ID** GD0111 **Category** Usage **Fix is breaking or non-breaking** Non-breaking **Enabled by default** Yes ==================================== ====================================== Cause ----- A property is annotated with the ``[ExportToolButton]`` attribute but it's not an `expression-bodied property`_. Rule description ---------------- When reloading the .NET assembly, Godot will attempt to serialize exported members to preserve their values. A field or a property with a backing field that stores a ``Callable`` may prevent the unloading of the assembly. An expression-bodied property doesn't have a backing field and won't store the ``Callable``, so Godot won't attempt to serialize it, which should result in the successful reloading of the .NET assembly. .. code-block:: csharp [ExportToolButton("Click me!")] public Callable ValidClickMeButton => Callable.From(ClickMe); // Invalid because the Callable will be stored in the property's backing field. [ExportToolButton("Click me!")] public Callable InvalidClickMeButton { get; } = Callable.From(ClickMe); How to fix violations --------------------- To fix a violation of this rule, replace the property implementation with an `expression-bodied property`_. When to suppress warnings ------------------------- Do not suppress a warning from this rule. ``Callable`` instances may prevent the .NET assembly from unloading. .. _expression-bodied property: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members#properties