Skip to content

GD0111: The exported tool button must be an expression-bodied property

Value
Rule IDGD0111
CategoryUsage
Fix is breaking or non-breakingNon-breaking
Enabled by defaultYes

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.

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.