Не работает проверка обьекта struct на null

245
11 мая 2018, 09:36

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

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

Answer 1

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

READ ALSO
Сброс сессии webbrowers

Сброс сессии webbrowers

Есть авторизация в вк

202
Selenium webDriverWait ожидание вновь созданного frame

Selenium webDriverWait ожидание вновь созданного frame

Создается новый frame, не обходимо переключится в него делаю так waitUntil(ch => ch

219
ComboBox WPF + ObservableCollection&lt;&gt;()

ComboBox WPF + ObservableCollection<>()

В общем есть ComboBox в который нужно передать значения через binding из ObservableCollectionПробовал сделать так, но выводит "First

199
Проблемы с наследованием в классах C#

Проблемы с наследованием в классах C#

Имеется сейчас два класса- один базовый, другой наследуется от первогоКод первого класса:

230