136 lines
1.8 KiB
C#
136 lines
1.8 KiB
C#
|
public interface INode<T>
|
||
|
{
|
||
|
void Hello (T t);
|
||
|
}
|
||
|
|
||
|
public class Stack<T>
|
||
|
{
|
||
|
public T TheData;
|
||
|
public readonly Foo<T> TheFoo;
|
||
|
|
||
|
public Stack (T t)
|
||
|
{
|
||
|
this.TheData = t;
|
||
|
this.TheFoo = new Foo<T> (t);
|
||
|
}
|
||
|
|
||
|
public INode<T> GetNode ()
|
||
|
{
|
||
|
return new Node (this);
|
||
|
}
|
||
|
|
||
|
public Foo<T> GetFoo (T t)
|
||
|
{
|
||
|
return new Foo<T> (t);
|
||
|
}
|
||
|
|
||
|
public Bar<T> GetBar (T t)
|
||
|
{
|
||
|
return new Bar<T> (t);
|
||
|
}
|
||
|
|
||
|
protected class Node : INode<T>
|
||
|
{
|
||
|
public readonly Stack<T> Stack;
|
||
|
|
||
|
public Node (Stack<T> stack)
|
||
|
{
|
||
|
this.Stack = stack;
|
||
|
}
|
||
|
|
||
|
public void Hello (T t)
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class Foo<T>
|
||
|
{
|
||
|
public readonly T Data;
|
||
|
|
||
|
public Bar<T> GetBar ()
|
||
|
{
|
||
|
return new Bar<T> (Data);
|
||
|
}
|
||
|
|
||
|
public Foo (T t)
|
||
|
{
|
||
|
this.Data = t;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class Bar<U>
|
||
|
{
|
||
|
public readonly U Data;
|
||
|
|
||
|
public Bar (U u)
|
||
|
{
|
||
|
this.Data = u;
|
||
|
}
|
||
|
|
||
|
public Foo<T> GetFoo (Stack<T> stack)
|
||
|
{
|
||
|
return stack.TheFoo;
|
||
|
}
|
||
|
|
||
|
public class Baz<V>
|
||
|
{
|
||
|
public readonly V Data;
|
||
|
|
||
|
public Foo<T> GetFoo (Stack<T> stack)
|
||
|
{
|
||
|
return new Foo<T> (stack.TheData);
|
||
|
}
|
||
|
|
||
|
public Bar<V> GetBar ()
|
||
|
{
|
||
|
return new Bar<V> (Data);
|
||
|
}
|
||
|
|
||
|
public Baz (V v)
|
||
|
{
|
||
|
this.Data = v;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Test ()
|
||
|
{
|
||
|
Stack<T>.Foo<T> foo1 = GetFoo (TheData);
|
||
|
Foo<T> foo2 = GetFoo (TheData);
|
||
|
|
||
|
Stack<long>.Foo<T> foo3 = new Stack<long>.Foo<T> (TheData);
|
||
|
Stack<long>.Foo<float> foo4 = new Stack<long>.Foo<float> (3.14F);
|
||
|
|
||
|
Foo<double> foo5 = new Foo<double> (3.14);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class A<U>
|
||
|
{
|
||
|
public class Test<T>
|
||
|
{
|
||
|
public static Nested<T> Foo ()
|
||
|
{
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
public class Nested<X>
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class X
|
||
|
{
|
||
|
public static int Main ()
|
||
|
{
|
||
|
Stack<int> stack = new Stack<int> (1);
|
||
|
INode<int> node = stack.GetNode ();
|
||
|
Stack<int>.Foo<int> foo = stack.GetFoo (7);
|
||
|
Stack<int>.Bar<int> bar = stack.GetBar (8);
|
||
|
|
||
|
A<bool>.Test<string>.Nested<string> v = A<bool>.Test<string>.Foo ();
|
||
|
return 0;
|
||
|
}
|
||
|
}
|