哪些 Unity 类型可以为空?

Pau*_*one 1 c# nullable unity-game-engine

为什么这么放

Renderer? myRenderer;
Run Code Online (Sandbox Code Playgroud)

产生错误

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>'
Run Code Online (Sandbox Code Playgroud)

然而

Vector3? myVector3;
Run Code Online (Sandbox Code Playgroud)

才不是?

举例来说,我希望能够写

void ApplyMaterial(Material material)
{
    Renderer? renderer = targetDefinedExternally;
    renderer?.material = material;
}
Run Code Online (Sandbox Code Playgroud)

相比之下,以下不会产生错误

Vector3? vector;
float? magnitude = vector3?.magnitude;
vector3?.Normalize();
Run Code Online (Sandbox Code Playgroud)

这表明某些 Unity 类型可以为空,而其他类型则不能。我怎么知道哪个是哪个?(有没有一种优雅的方法来解决这个问题?)

Swe*_*per 5

所有类型都可以为空。

类型要么是引用类型,要么是值类型。引用类型本身可以为空。默认情况下,值类型不可为空,并且可以使用?前缀将其设置为可以为空。

Renderer是一个类,这意味着它是一个引用类型。所以你不需要它?,它会起作用:

void ApplyMaterial(Material material)
{
    Renderer renderer = targetDefinedExternally;
}
Run Code Online (Sandbox Code Playgroud)

Vector3是一个结构体,它是一种值类型。这就是为什么你可以这样做:

Vector3? myVector3;
Run Code Online (Sandbox Code Playgroud)

如果您的 Unity 版本支持 C# 8,Renderer?也可以使用,因为它使用了C# 8 中的空引用类型功能。


也就是说,renderer?.material = material;在任何一种情况下都不起作用,因为null 条件运算符 ?.不能在赋值的 LHS 中使用:(