Не удается неявно преобразовать тип `UnityEngine.ScriptableObject 'в` T' - PullRequest
0 голосов
/ 29 января 2019
public class UVBaseTool : ScriptableObject, IPropertiesChanged
{
    private BaseToolProperties properties_;
    private ScriptableObject propertiesNoValidate_;

    // Some code ...

    protected void SetProperties(System.Type propertiesType, System.Type properties1Type)
    {
        properties_ = propertiesType == null ? null : CreateInstance(propertiesType) as BaseToolProperties;
        if (properties_ != null)
        {
            properties_.tool = (this);
        }

        propertiesNoValidate_ = properties1Type == null ? null : CreateInstance(properties1Type);
    }

    public T Properties<T>()
    {
        return properties_;
    }

    public T PropertiesNoValidate<T>()
    {
        return propertiesNoValidate_;
    }
}

Может ли кто-нибудь помочь мне с этим, так как я не могу устранить эти ошибки:

  1. Активы / Rocket / Archi / Скрипты / Редактор / UVEditor / UVBaseTool.cs (219, 14): ошибка CS0029: невозможно неявное преобразование типа Rocket.Archi.BaseToolProperties' to T '
  2. Активы / Rocket / Archi / Scripts / Editor / UVEditor / UVBaseTool.cs (224,14): ошибка CS0029: невозможно неявное преобразование типаUnityEngine.ScriptableObject' to T '

Я попытался просмотреть онлайн-контекст для CS0029, но все же не могу конвертировать через IConvertable.Пожалуйста, дайте мне знать, если есть решение.

Вот как я звоню

[SerializeField]
private BaseToolProperties properties_;
[SerializeField]
private ScriptableObject propertiesNoValidate_;

public virtual void Start()
{
      EditorUtil.HideGlobalGizmo();
      ArchiEx.selectedElements.ClearVertexBoxes();
      ArchiEx.currentCamera = (Camera) null;
      GizmoHandler.Destroy();
      if (properties_ != null)
        EditorUtil.LoadObject(properties_, null);
      if (propertiesNoValidate_ != null)
        EditorUtil.LoadObject(propertiesNoValidate_, null);
      Ruler.Add(this, RulerType.Local);
      ArchiSettings.GatherArchi();
}

И это baseTool;

using System;
using UnityEngine;

namespace Rocket.Archi
{
  [Serializable]
  public class BaseToolProperties : ScriptableObject
  {
    [NonSerialized]
    public IPropertiesChanged tool;

    public virtual void OnValidate()
    {
      if (tool == null)
        return;
      tool.OnPropertiesChanged();
    }
  }
}

Прикрепленное изображение показывает, как я вызываю свойства в других классах и, поверьте мне, в этой части нет ошибки, я проверял весь контекст снова и снова, но эта универсальная функция убивает меня.

ошибка уходит, если я напишу это так, но теперь я получаю еще одну ошибку, которая предназначена для IConvertableВсякий раз, когда я пытаюсь сделать объект в виде сцены, я получаю эту повторяющуюся ошибку.См. Ниже;

public T Properties<T>()
    {
        return (T)Convert.ChangeType(properties_, typeof(T));
    }

    public T PropertiesNoValidate<T>()
    {
        return (T)Convert.ChangeType(propertiesNoValidate_, typeof(T));
    }

InvalidCastException: объект должен реализовывать IConvertible.System.Convert.ChangeType (значение System.Object, преобразование System.Type, провайдер System.IFormatProvider) (в: 0) System.Convert.ChangeType (значение System.Object, преобразование System.Type) (в: 0) RocketMod.Archi.BaseTool.Properties [T] () (в разделе Активы / Ракета - Инструменты моделирования / Archi / Сценарии / Редактор / BaseTool.cs: 224) RocketMod.Archi.PropertiesGUI.HasContents () (в Активы / Ракета - Инструменты моделирования / Archi /Скрипты / Редактор / PropertiesGUI.cs: 54) RocketMod.Archi.PropertiesGUI.OnGUI () (в разделе Активы / Rocket - Инструменты моделирования / Archi / Скрипты / Редактор / PropertiesGUI.cs: 17) RocketMod.Archi.ToolSelectionGUI.OnGUI () (в Assets / Rocket - Инструменты моделирования / Archi / Сценарии / Редактор / ToolSelectionGUI.cs: 164) RocketMod.Archi.ArchiEditor.OnInspectorGUI () (в Assets / Rocket - Инструменты моделирования / Archi / Скрипты / Редактор / ArchiEditor.cs: 299)UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor [] редакторы, System.Int32 editorIndex, System.Boolean rebuildOptimizedGUIBlock, System.Boolean & showImportedObjectBarNext, UnityEngine.Rect&ortedObjectBarRect) (в C: /buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs: 1253) UnityEngine.GUIUtility: ProcessEvent (Int32, IntPtr)

, если для решения этой проблемы, напишите, как показано нижевсе перестает работать;

public T Properties<T>() where T : IConvertible
    {
        return (T)Convert.ChangeType(properties_, typeof(T));
    }

    public T PropertiesNoValidate<T>() where T : IConvertible
    {
        return (T)Convert.ChangeType(propertiesNoValidate_, typeof(T));
    }

ЛЮБАЯ ПОМОЩЬ БЫЛА МНОГО ЦЕННЫХ ПАРНИ !!!

1 Ответ

0 голосов
/ 29 января 2019

В вашем методе используется универсальный тип <T>, который возвращает определенное типизированное свойство.

Замените сигнатуру ваших методов словами:

//     v----------------v--------------The type of properties_
public BaseToolProperties Properties()
{   //                              ^----------------the <T> was removed
    return properties_;
}

//     v--------------v----------------The type of propertiesNoValidate_
public ScriptableObject PropertiesNoValidate()
{   //                                      ^--------the <T> was removed
    return propertiesNoValidate_;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...