Итак, что здесь происходит?
Когда мы более внимательно посмотрим на сообщение об ошибке
Аргумент 2: невозможно преобразовать из '[] options>' в 'UnityEngine.Object'
говорит о том, что мы пытаемся преобразовать массив опций в тип UnityEngine.Object
.Хммм.это странно, мы не определили наш Словарь с помощью этой ерунды в Unity, так почему он использует его вместо класса объектов C #? *
Ну, вы, вероятно, используете другие классы Unity и, вероятно, имеете что-то вроде
using UnityEngine;
в вашем пространстве имен.Проблема с C # заключается в том, что его класс Object
также находится в пространстве имен, которое называется System
, что делает его полностью идентифицируемым только с помощью System.Object
.Поэтому, если у вас нет
using System;
, он с радостью попытается использовать UnityEngine.Object
вместо System.Object
при вводе Object
.Таким образом, эта странная ошибка компилятора произойдет.
Так что просто используйте System.Object
и все в порядке верно ?
Ну да.Но в истории есть еще кое-что!
C # также определил псевдонимы для своих наиболее распространенных типов - так называемых встроенных типов:
bool System.Boolean
byte System.Byte
sbyte System.SByte
char System.Char
decimal System.Decimal
double System.Double
float System.Single
int System.Int32
uint System.UInt32
long System.Int64
ulong System.UInt64
object System.Object
short System.Int16
ushort System.UInt16
string System.String
Вы обнаружите, что строчные буквы object
это просто псевдоним System.Object
.Но ждать!Разве это не заставляет object
всегда использовать System.Object
независимо от наших операторов использования?Ответ - да, да, это так ...
Позвольте мне на следующем примере проиллюстрировать, насколько хитрым может быть пространство имен в C #:
public class Object
{
public string Name { get; set; }
}
public class TestConsole
{
public static void Main(string[] args)
{
Object fakeObject = new Object(); // -> Custom Object class
object realDeal = new object(); // -> System.Object
string name = fakeObject.Name // OK
name = realDeal.Name // NOT OK
}
}
Значит ли это, что мы всегда должны использоватьвстроенный псевдоним при использовании системных классов?Не совсем, но мы должны , а использовать соглашение об именах, которое используется Microsoft.Это означает, что всякий раз, когда вы используете класс как тип данных, вы должны использовать встроенный и всякий раз, когда вы используете статические члены класса, вы должны использовать его полное имя.Например:
object humberto = "humberto";
string rudolf = "rudolf";
Object.Equals(humberto, rudolf);