У меня есть проблема, вызванная моно-средой выполнения, вызывающей, казалось бы, случайный метод получения вместо метода интерфейса.
Я сузил ядро до:
IGraphElementEditorData test = provider.CreateEditorData();
if (!typeof(IGraphElementEditorData).IsAssignableFrom(test))
{
Debug.LogWarning("Please don't get logged.");
}
К сожалению, он регистрируется:
Очевидно, среда выполнения делает что-то не так, нарушая безопасность типов.
Программа работает в среде Unity Mono 2.X.
Исследуя далее, я обнаружил, что provider.CreateEditorData()
фактически вызывает совершенно другой метод для самого провайдера: он вызывает метод получения provider.source
, который даже не совместим по типу:
0x0000000031E8E84B (Mono JIT Code) Bolt.InvalidConnection:get_source ()
0x000000003493D53F (Mono JIT Code) Bolt.UnitConnection`2<object, object>:Ludiq.IConnection<Bolt.IUnitOutputPort,Bolt.IUnitInputPort>.get_source ()
0x00000000321F719A (Mono JIT Code) Ludiq.GraphPointer:GetElementEditorData<object> (Ludiq.IGraphElementEditorDataProvider)
Тип провайдера находится в сложной цепочке наследования, включающей интерфейсы, абстрактные классы и обобщения, и я даже не знаю, как начать изоляцию проблемы на этом этапе.
Я спрашиваю как мне подойти к отладке? Это первый раз, когда я сталкиваюсь с подобной проблемой, и я недостаточно знаком с терминологией времени выполнения Mono, чтобы даже начать поиск. Из того, что я понимаю, кажется, что это может быть проблема с виртуальной таблицей (vtable) указателей методов, но я не могу найти сообщение об ошибке в программном обеспечении отслеживания Mono, которое соответствует моей проблеме.