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 ключевое слово. Могу ли я не доверять этому вообще?

Ответы на вопрос(3)

Ваш ответ на вопрос