Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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");
- }
- }
- 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> { }
- EAX = 02B811B4 EBX = 0641EA5C ECX = 02C3B0EC EDX = 02C3A504 ESI = 02C2564C
- EDI = 0641E9AC EIP = 011027B9 ESP = 0641E91C EBP = 0641E9B8 EFL = 00000202
- class Program
- {
- static void Main()
- {
- dynamic obj = new Third<int>();
- Print(obj); // causes stack overflow
- }
- static void Print(object obj) { }
- }
- class First<T> where T : First<T> { }
- class Second<T> : First<T> where T : First<T> { }
- class Third<T> : Second<Third<T>> { }
- Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadSymbolsFromType(
- System.Type originalType
- )
- Microsoft.CSharp.RuntimeBinder.SymbolTable.GetConstructedType(
- System.Type type,
- Microsoft.CSharp.RuntimeBinder.Semantics.AggregateSymbol agg
- )
- Microsoft.CSharp.RuntimeBinder.Semantics.TypeManager.SubstTypeCore(
- Microsoft.CSharp.RuntimeBinder.Semantics.CType type,
- Microsoft.CSharp.RuntimeBinder.Semantics.SubstContext pctx
- )
- Microsoft.CSharp.RuntimeBinder.Semantics.TypeManager.SubstTypeArray(
- Microsoft.CSharp.RuntimeBinder.Semantics.TypeArray taSrc,
- Microsoft.CSharp.RuntimeBinder.Semantics.SubstContext pctx
- )
- class Program
- {
- static void Main()
- {
- dynamic obj = new Second<int>();
- Print(obj);
- }
- static void Print(object obj) { }
- }
- internal class First<T>
- where T : First<T> { }
- internal class Second<T> : First<Second<T>> { }
- abstract class SetTreeNode<TKey> : KeyTreeNode<SetTreeNode<TKey>, TKey> { }
- interface ISortedSet<TKey> { }
- sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> { }
- abstract class BalancedTree<TNode> { }
- abstract class SetTreeNode<TKey> : KeyTreeNode<SetTreeNode<TKey>, TKey> { }
- abstract class KeyTreeNode<TNode, TKey> : TreeNode<TNode> { }
- abstract class TreeNode<TNode> { }
- interface ISortedSet<TKey> { }
- sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> { }
- abstract class BalancedTree<TNode> { }
- abstract class SetTreeNode<TKey> : KeyTreeNode<TKey, TKey> { }
- abstract class KeyTreeNode<TNode, TKey> : TreeNode<TNode> { }
- abstract class TreeNode<TNode> { }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement