哪些 Unity 类型可以为空?
Which Unity types are nullable?
为什么要放
Renderer? myRenderer;
产生错误
The type 'Renderer' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Nullable<T>'
而
Vector3? myVector3;
没有?
举例来说,我希望能够写
void ApplyMaterial(Material material)
{
Renderer? renderer = targetDefinedExternally;
renderer?.material = material;
}
相比之下,以下不会产生错误
Vector3? vector;
float? magnitude = vector3?.magnitude;
vector3?.Normalize();
这表明某些 Unity 类型可以为空,而其他类型则不能。我怎么知道哪个是哪个? (有没有一种优雅的方法来解决这个问题?)
所有类型都可以为空。
类型是引用类型或值类型。引用类型本身可以为空。默认情况下,值类型不可为空,可以使用 ?
前缀使之为空。
Renderer
是一个 class,这意味着它是一个引用类型。所以你不需要 ?
它会起作用:
void ApplyMaterial(Material material)
{
Renderer renderer = targetDefinedExternally;
}
Vector3
是一个struct,是一个值类型。这就是为什么你可以这样做:
Vector3? myVector3;
如果您的 version of Unity supports C# 8, Renderer?
would have worked too, since that is using the nullable reference type 功能来自 C# 8。
也就是说,renderer?.material = material;
在任何一种情况下都不起作用,因为 null conditional operator ?.
不能用于作业的左手边 :(
为什么要放
Renderer? myRenderer;
产生错误
The type 'Renderer' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Nullable<T>'
而
Vector3? myVector3;
没有?
举例来说,我希望能够写
void ApplyMaterial(Material material)
{
Renderer? renderer = targetDefinedExternally;
renderer?.material = material;
}
相比之下,以下不会产生错误
Vector3? vector;
float? magnitude = vector3?.magnitude;
vector3?.Normalize();
这表明某些 Unity 类型可以为空,而其他类型则不能。我怎么知道哪个是哪个? (有没有一种优雅的方法来解决这个问题?)
所有类型都可以为空。
类型是引用类型或值类型。引用类型本身可以为空。默认情况下,值类型不可为空,可以使用 ?
前缀使之为空。
Renderer
是一个 class,这意味着它是一个引用类型。所以你不需要 ?
它会起作用:
void ApplyMaterial(Material material)
{
Renderer renderer = targetDefinedExternally;
}
Vector3
是一个struct,是一个值类型。这就是为什么你可以这样做:
Vector3? myVector3;
如果您的 version of Unity supports C# 8, Renderer?
would have worked too, since that is using the nullable reference type 功能来自 C# 8。
也就是说,renderer?.material = material;
在任何一种情况下都不起作用,因为 null conditional operator ?.
不能用于作业的左手边 :(