StackOverflowException при доступе к члену универсального типа через динамический: .NET / C # Framework ошибка?
В программе я использую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");
}
}
Эта программа будетобычно выведите «set», если обновленный экземпляр реализуетISortedSet<TKey>
интерфейс и распечатать «объект» для всего остального. Но со следующими заявлениями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
ключевое слово. Могу ли я не доверять этому вообще?