Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
變體¶
有關 Variant 的一般詳細說明,請參閱 Variant <class_Variant> 檔案頁面。
Godot.Variant
用來表示 Godot 的原生 Variant 型別。任何與 Variant 相容的型別都可以與其進行轉換。我們建議避免使用“Godot.Variant”,除非需要與非型別化引擎 API 互動。盡可能利用 C# 的型別安全性。
任何「Variant.As{TYPE}」方法或通用「Variant.As<T>」方法都可用於將「Godot.Variant」轉換為 C# 型別。由於「Godot.Variant」型別包含為所有支援的型別定義的隱式轉換,因此通常不需要直接呼叫這些方法。
使用 CreateFrom 方法重載或通用 Variant.From<T> 方法將 C# 型別轉換為 Godot.Variant 。
備註
由於 C# 中的 Variant 型別是一個結構體,因此它不能為 null。若要建立“null”變體,請使用“default”關鍵字或無參數建構函式。
自定變數型別¶
所有「內建值型別 <https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/built-in-types-table>」_,除了「decimal」 、「nint」和「nuint」。
: String
在「Godot.Collections」命名空間中定義的集合型別。
Variant 型別及其等效 C# 型別的完整列表:
變體 |
型別 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
警告
Godot 在 Variant 中使用 64 位元整數和浮點數。支援較小的整數和浮點型別,例如“int”、“short”和“float”,因為它們可以適應更大的型別。請注意,執行隱式轉換,因此使用錯誤的型別將導致潛在的精確度損失。
警告
列舉受“Godot.Variant”支援,因為它們的基礎型別是所有相容的整數型別。但是,隱式轉換不存在,列舉必須手動轉換為其基礎整數型別,然後才能與“Godot.Variant”轉換或使用通用“Variant.As<T>”和“ Variant.From<T>`` 方法來轉換它們。
enum MyEnum { A, B, C }
Variant variant1 = (int)MyEnum.A;
MyEnum enum1 = (MyEnum)(int)variant1;
Variant variant2 = Variant.From(MyEnum.A);
MyEnum enum2 = variant2.As<MyEnum>();
在通用本文中使用 Variant¶
使用泛型時,您可能有興趣將泛型「T」型別限制為 Variant 相容型別之一。這可以使用“[MustBeVariant]”屬性來實作。
public void MethodThatOnlySupportsVariants<[MustBeVariant] T>(T onlyVariant)
{
// Do something with the Variant-compatible value.
}
與泛型 Variant.From<T>
結合使用,您可以從泛型 T
型別的實例取得 Godot.Variant
實例。然後它可以在任何只支援``Godot.Variant``結構的API中使用。
public void Method1<[MustBeVariant] T>(T variantCompatible)
{
Variant variant = Variant.From(variantCompatible);
Method2(variant);
}
public void Method2(Variant variant)
{
// Do something with variant.
}
為了呼叫具有「[MustBeVariant]」屬性註釋的泛型參數的方法,該值必須是 Variant 相容型別或以「[MustBeVariant]」註釋的泛型「T」型別屬性也是如此。
public class ObjectDerivedClass : GodotObject { }
public class NonObjectDerivedClass { }
public void Main<[MustBeVariant] T1, T2>(T1 someGeneric1, T2 someGeneric2)
{
MyMethod(42); // Works because `int` is a Variant-compatible type.
MyMethod(new ObjectDerivedClass()); // Works because any type that derives from `GodotObject` is a Variant-compatible type.
MyMethod(new NonObjectDerivedClass()); // Does NOT work because the type is not Variant-compatible.
MyMethod(someGeneric1); // Works because `T1` is annotated with the `[MustBeVariant]` attribute.
MyMethod(someGeneric2); // Does NOT work because `T2` is NOT annotated with the `[MustBeVariant]` attribute.
}
public void MyMethod<[MustBeVariant] T>(T variant)
{
// Do something with variant.
}