StackOverflowException ao acessar membro do tipo genérico via dinâmico: bug da estrutura do .NET / C #?
Em um programa eu estou usando odynamic
para invocar o melhor método de correspondência. No entanto, descobri que a estrutura falha com umStackOverflowException
sob algumas circunstâncias.
Tentei simplificar o meu código o máximo possível enquanto ainda conseguia reproduzir esse problema.
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");
}
}
Esse programanormalmente imprima "set" se a nova instância implementar oISortedSet<TKey>
faça interface e imprima "objeto" para qualquer outra coisa. Mas, com as seguintes declarações, umStackOverflowException
é lançada (como observado em um comentário acima).
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> { }
Se isso é um bug ou não, é muito preocupante que umStackOverflowException
é lançado porque não conseguimos capturá-lo e também praticamente incapaz de determinar com antecedência se uma exceção será lançada (e, assim, encerrar o processo!).
Alguém pode explicar o que está acontecendo? Isso é um bug na estrutura?
Ao depurar e alternar para o "modo de desmontagem", vejo o seguinte:
Registre o dump nesse local:
EAX = 02B811B4 EBX = 0641EA5C ECX = 02C3B0EC EDX = 02C3A504 ESI = 02C2564C
EDI = 0641E9AC EIP = 011027B9 ESP = 0641E91C EBP = 0641E9B8 EFL = 00000202
Isso não me diz muito mais do que ser um indicador de que isso realmente deve ser algum tipo de bug na estrutura.
Eu tenhoapresentou um relatório de bug no Microsoft Connect mas estou interessado em saber o que está acontecendo aqui. Minhas declarações de classe não são suportadas de alguma forma?
Não saber por que isso está acontecendo me preocupa com outros lugares onde estamos usando odynamic
palavra-chave Não posso confiar nisso?