c# - 哪些 Unity 类型可以为空?

标签 c# unity3d 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是一个类,这意味着它是一个引用类型。所以你不需要 ? 它会起作用:

void ApplyMaterial(Material material)
{
    Renderer renderer = targetDefinedExternally;
}

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

Vector3? myVector3;

如果您的 version of Unity支持 C# 8,Renderer? 也可以工作,因为它使用了 nullable reference type来自 C# 8 的特性。


也就是说,renderer?.material = material; 在这两种情况下都不起作用,因为 null conditional operator ?. 不能在赋值的 LHS 中使用 :(

关于c# - 哪些 Unity 类型可以为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64444247/

相关文章:

c# - 在属性上实现 IEnumerable

linux - 在Linux中的GTK应用程序中处理音量键

c# - 具有多项选择的内联 if-else 语句

ios - 如何修复Mac o链接器(id错误)

kotlin - 在不可空字段中测试驱动的最佳方法

c# - iTextSharp:横向表格

c# - 适用于 .Net 的新 Relic 插件 SDK

c# - 级联集空 Entity Framework

typescript - 为什么不允许对 Typescript 中的数组条目进行空检查?

c# - 为什么 List<T>.IndexOf(T) 不返回可为空的 int 是否有实际原因?