3

В классе есть такие поля:

   [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?

Alerr
  • 2,606

1 Answers1

2

Структура является типом значения, а переменная типа значения не может иметь значение 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_.