LINUX.ORG.RU

В Mono перестаёт срабатывать приведение типов

 ,


0

2

В vs 2010 компилируется структура: Dictionary, в котором ключом является enum, а полем - вложенный словарь, ключом которого на этот раз является uint32, а полем - ещё один словарь с enum и, наконец, классом в качестве поля. Не спрашивайте, зачем это, код не мой, я только разбираюсь. В шаблонный метод, работающий с этой структурой, поступает тип(enum). Если он совпадает с каким-то известным типом enum'ов, нижние ярусы словаря начинают заполняться:

if (typeof(TGameObjectSubEnum) == typeof(BuildingEnum))                   
{                        
  foreach (var buildingType in Enum.GetValues(typeof(BuildingEnum)))
    ConfigureParametersMap[(FactionEnum)factionType][(UInt32)level][(TGameObjectSubEnum)buildingType] = 
    GameObjectFactoryContainer<AbstractBuilding, BuildingEnum>.Instance.CreateParams((FactionEnum)factionType, (UInt32)level, (BuildingEnum)buildingType) as AbstractGameObject<TGameObjectSubEnum>.Params;                    
}

Это собирается в винде. Но в mono(3.0.2, пробовал устанавливать 3 и 4 версию языка в параметрах компиляции, т.ч. дело не в версии) выдает ошибку, как если бы убрали последнее приведение, т.е.

error CS0039: Cannot convert type `CCC.Domain.UserContext.FarmModule.Objects.AbstractGameObject<CCC.Domain.UserContext.FarmModule.Objects.BuildingEnum>.Params' to `CCC.Domain.UserContext.FarmModule.Objects.AbstractGameObject<TGameObjectSubEnum>.Params' via a built-in conversion

Из-за чего это может происходить?

★★★★

via a built-in conversion

В моне её ещё не написали?

ziemin ★★
()

Игла в яйце, яйцо в утке, утка в зайце, заяц в шоке

Не спрашивайте, зачем это, код не мой, я только разбираюсь.

А зачем в этом... разбираться?

slackwarrior ★★★★★
()

Разбей этого монстра на подвыражения, и сразу все станет ясно. Возможно у mono вывод типов не справляется с такой длинной конструкцией...

nikitazu
()

Оказалось, надо создать нужное выражение как Object и заменить явным приведением типа:

Object parameters = GameObjectFactoryContainer<AbstractAchievement, AchievementEnum>.Instance.CreateParams((FactionEnum)factionType, (UInt32)level, (AchievementEnum)achievementType);
ConfigureParametersMap[(FactionEnum)factionType][(UInt32)level][(TGameObjectSubEnum)achievementType] = (AbstractGameObject<TGameObjectSubEnum>.Params)parameters;

wingear ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.