добавить типизированную утку структуру в словарь c # - PullRequest
0 голосов
/ 08 июня 2018

Я хочу добавить типизированную утку структуру в словарь, но получаю следующую ошибку:

Аргумент 2: невозможно преобразовать из '[] options>' в 'UnityEngine.Object'

Это код, который у меня есть:

public class Dynamic_Interface
{
    private static Dictionary<int, Object> Interface_steps = new Dictionary<int, Object>();

    Dynamic_Interface()
    {
        var sentences = new[] 
        {
            new
            {
                identifier = 1,
                text = "string explain",
                options = new[] 
                {
                    new
                    {
                        next = 2,
                        value = "this is the first option"
                    },
                    new
                    {
                        next = 2,
                        value = "this is the second option"
                    },
                    new
                    {
                        next = 2,
                        value = "this is the third option"
                    },
                    new
                    {
                        next = 2,
                        value = "this is the fourth option"
                    },
                }
            },
            new
            {
                identifier = 2,
                text = "string explain second var",
                options = new[] 
                {
                    new
                    {
                        next = 3,
                        value = "this is the second first option"
                    },
                    new
                    {
                        next = 3,
                        value = "this is the second second option"
                    },
                    new
                    {
                        next = 3,
                        value = "this is the second third option"
                    },
                    new
                    {
                        next = 3,
                        value = "this is the second fourth option"
                    }
                }
            },
        };

        foreach (var sentence_obj in sentences)
        {
            Interface_steps.Add(sentence_obj.identifier, sentence_obj);
        }
    }
}

В конце я хочу словарь, содержащий каждый объект в sentences[], который имеет identifier key в качестве имени всловарь.

Я привык к javascript, и это действительно мой первый раз, когда я делал c #, так что извините за ошибку новичка.Но я действительно не могу найти, как заставить это работать.
Если что-то неясно, дайте мне знать, чтобы я мог уточнить ..

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Итак, что здесь происходит?
Когда мы более внимательно посмотрим на сообщение об ошибке

Аргумент 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);
0 голосов
/ 08 июня 2018

Строгая типизация является одним из преимуществ C #, она немного более многословна, чем ducktyping, но избавляет вас от головной боли, если это возможно, старайтесь воздерживаться от var, на несколько символов короче, но если вы используете сильные типы, ее гораздо сложнееслучайно попросите компилятор сделать что-то отличное от того, что вы на самом деле хотите:

Два варианта альтернативных подходов, которые, кажется, сразу выделяются:

class myClass { int next; string value; };
Dictionary <int, myClass> dict;

или, возможно, хотя я думаю, что этоне совсем то, что вы пытаетесь сделать

Dictionary<int, Dictionary<int,string>> dict; 

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

Может быть, вы хотите объединить вышеперечисленное в

Dictionary<int, Dictionary<int,myClass>> dict; 
...