В классе есть такие поля:
[Serializable]
public struct MaterialList {
public Material[] sharedMat_;
public MaterialList(Material[] m){
sharedMat_ = m;
}
}
[SerializeField, ReadOnly]
MaterialList myAnimateMaterial;
В одном из методов нужно осуществить проверку: myAnimateMaterial == null.
Компилятор ругается на проверку так:
Operator ==' cannot be applied to operands of type
CubeFreeze.MaterialList' and `null'
Тогда заменяю MaterialList myAnimateMaterial; на MaterialList? myAnimateMaterial;
Тогда компилятор ругается иначе:
Type CubeFreeze.MaterialList?' does not contain a definition for
sharedMat_' and no extension method sharedMat_' of type
CubeFreeze.MaterialList?' could be found. Are you missing an assembly
reference?
Вопрос, почему он не видит sharedMat_? Как сделать так чтобы структуру можно было проверить на null так же как в С++?
И вообще, для чего они запретили проверять структуры на null? В C# обьект структуры никогда не может быть null?
Структура является типом значения, а переменная типа значения не может иметь значение null по определению, поэтому вам придется воспользоваться Nullable-переменной.
Тип MyStruct? — это просто алиас для Nullable<MyStruct>, а Nullable<T>, естественно, не содержит в себе любых случайных полей или свойств (наподобие sharedMat_).
Для того, чтобы извлечь из Nullable обернутую им структуру — воспользуйтесь свойством Value: myAnimateMaterial.Value.sharedMat_;
Также, в Nullable<T> определен оператор явного приведения в T, этим можно воспользоваться так: ((MaterialList)myAnimateMaterial).sharedMat_;
Имейте ввиду, что если в переменной типа Nullable лежит значение null, то эти 2 способа выбросят исключение, поэтому не забудьте сделать перед этим проверку.
Также, если вас устроит null-значение когда сама переменная myAnimateMaterial имеет значение null, то проще всего воспользоваться null-условным оператором ?. (C# 6 и выше): myAnimateMaterial?.sharedMat_.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей