В программе я использую ключевое слово dynamic
для вызова наилучшего метода сопоставления. Тем не менее, я обнаружил, что в некоторых случаях фреймворк падает с StackOverflowException
.
Я попытался как можно больше упростить код, сохраняя возможность повторного создания этой проблемы.
class Program
{
static void Main(string[] args)
{
var obj = new SetTree<int>();
var dyn = (dynamic)obj;
Program.Print(dyn); // throws StackOverflowException!!
// Note: this works just fine for 'everything else' but my SetTree<T>
}
static void Print(object obj)
{
Console.WriteLine("object");
}
static void Print<TKey>(ISortedSet<TKey> obj)
{
Console.WriteLine("set");
}
}
Эта программа будет обычно печатать "установить", если обновленный экземпляр реализует интерфейс ISortedSet<TKey>
и печатает "объект" для чего-либо еще. Но, вместо этого, вместо этого вызывается a StackOverflowException
(как отмечено в комментарии выше).
interface ISortedSet<TKey> { }
sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> {}
abstract class BalancedTree<TNode>
where TNode : TreeNode<TNode> { }
abstract class SetTreeNode<TKey> : KeyTreeNode<SetTreeNode<TKey>, TKey> { }
abstract class KeyTreeNode<TNode, TKey> : TreeNode<TNode>
where TNode : KeyTreeNode<TNode, TKey> { }
abstract class TreeNode<TNode>
where TNode : TreeNode<TNode> { }
Является ли это ошибкой или нет, очень беспокоит, что StackOverflowException
выбрасывается, поскольку мы не можем его поймать, а также в значительной степени неспособным заранее определить, будет ли исключено исключение (и тем самым прекратит процесс!).
Может кто-нибудь объяснить, что происходит? Является ли это ошибкой в рамках?
При отладке и переключении в "Режим разборки" я вижу следующее:
Зарегистрировать дамп в этом месте:
EAX = 02B811B4 EBX = 0641EA5C ECX = 02C3B0EC EDX = 02C3A504 ESI = 02C2564C
EDI = 0641E9AC EIP = 011027B9 ESP = 0641E91C EBP = 0641E9B8 EFL = 00000202
Это не говорит мне больше, чем показатель того, что это действительно должно быть какой-то ошибкой в рамках.
Я написал отчет об ошибке в Microsoft Connect, но мне интересно узнать, что здесь происходит. Являются ли объявления классов некорректными?
Не зная, почему это происходит, я беспокоюсь о других местах, где мы используем ключевое слово dynamic
. Могу ли я не доверять этому?