Advertisement
Guest User

Untitled

a guest
Apr 24th, 2014
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var obj = new SetTree<int>();
  6. var dyn = (dynamic)obj;
  7. Program.Print(dyn); // throws StackOverflowException!!
  8. // Note: this works just fine for 'everything else' but my SetTree<T>
  9. }
  10. static void Print(object obj)
  11. {
  12. Console.WriteLine("object");
  13. }
  14.  
  15. static void Print<TKey>(ISortedSet<TKey> obj)
  16. {
  17. Console.WriteLine("set");
  18. }
  19. }
  20.  
  21. interface ISortedSet<TKey> { }
  22.  
  23. sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> {}
  24.  
  25. abstract class BalancedTree<TNode>
  26. where TNode : TreeNode<TNode> { }
  27.  
  28. abstract class SetTreeNode<TKey> : KeyTreeNode<SetTreeNode<TKey>, TKey> { }
  29.  
  30. abstract class KeyTreeNode<TNode, TKey> : TreeNode<TNode>
  31. where TNode : KeyTreeNode<TNode, TKey> { }
  32.  
  33. abstract class TreeNode<TNode>
  34. where TNode : TreeNode<TNode> { }
  35.  
  36. EAX = 02B811B4 EBX = 0641EA5C ECX = 02C3B0EC EDX = 02C3A504 ESI = 02C2564C
  37. EDI = 0641E9AC EIP = 011027B9 ESP = 0641E91C EBP = 0641E9B8 EFL = 00000202
  38.  
  39. class Program
  40. {
  41. static void Main()
  42. {
  43. dynamic obj = new Third<int>();
  44. Print(obj); // causes stack overflow
  45. }
  46.  
  47. static void Print(object obj) { }
  48. }
  49.  
  50. class First<T> where T : First<T> { }
  51.  
  52. class Second<T> : First<T> where T : First<T> { }
  53.  
  54. class Third<T> : Second<Third<T>> { }
  55.  
  56. Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadSymbolsFromType(
  57. System.Type originalType
  58. )
  59.  
  60. Microsoft.CSharp.RuntimeBinder.SymbolTable.GetConstructedType(
  61. System.Type type,
  62. Microsoft.CSharp.RuntimeBinder.Semantics.AggregateSymbol agg
  63. )
  64.  
  65. Microsoft.CSharp.RuntimeBinder.Semantics.TypeManager.SubstTypeCore(
  66. Microsoft.CSharp.RuntimeBinder.Semantics.CType type,
  67. Microsoft.CSharp.RuntimeBinder.Semantics.SubstContext pctx
  68. )
  69.  
  70. Microsoft.CSharp.RuntimeBinder.Semantics.TypeManager.SubstTypeArray(
  71. Microsoft.CSharp.RuntimeBinder.Semantics.TypeArray taSrc,
  72. Microsoft.CSharp.RuntimeBinder.Semantics.SubstContext pctx
  73. )
  74.  
  75. class Program
  76. {
  77. static void Main()
  78. {
  79. dynamic obj = new Second<int>();
  80. Print(obj);
  81. }
  82.  
  83. static void Print(object obj) { }
  84. }
  85.  
  86. internal class First<T>
  87. where T : First<T> { }
  88.  
  89. internal class Second<T> : First<Second<T>> { }
  90.  
  91. abstract class SetTreeNode<TKey> : KeyTreeNode<SetTreeNode<TKey>, TKey> { }
  92.  
  93. interface ISortedSet<TKey> { }
  94.  
  95. sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> { }
  96.  
  97. abstract class BalancedTree<TNode> { }
  98.  
  99. abstract class SetTreeNode<TKey> : KeyTreeNode<SetTreeNode<TKey>, TKey> { }
  100.  
  101. abstract class KeyTreeNode<TNode, TKey> : TreeNode<TNode> { }
  102.  
  103. abstract class TreeNode<TNode> { }
  104.  
  105. interface ISortedSet<TKey> { }
  106.  
  107. sealed class SetTree<TKey> : BalancedTree<SetTreeNode<TKey>>, ISortedSet<TKey> { }
  108.  
  109. abstract class BalancedTree<TNode> { }
  110.  
  111. abstract class SetTreeNode<TKey> : KeyTreeNode<TKey, TKey> { }
  112.  
  113. abstract class KeyTreeNode<TNode, TKey> : TreeNode<TNode> { }
  114.  
  115. abstract class TreeNode<TNode> { }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement