Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

170 lines
2.5 KiB
C#

//
// Important test: Type parameters and boxing (26.7.3).
//
// This tests the constrained_ prefix opcode.
//
using System;
public interface ICounter
{
void Increment ();
}
namespace ValueTypeCounters
{
public struct SimpleCounter : ICounter
{
public int Value;
public void Increment ()
{
Value += 2;
}
}
public struct PrintingCounter : ICounter
{
public int Value;
public override string ToString ()
{
return Value.ToString ();
}
public void Increment ()
{
Value += 2;
}
}
public struct ExplicitCounter : ICounter
{
public int Value;
public override string ToString ()
{
return Value.ToString ();
}
void ICounter.Increment ()
{
Value++;
}
}
public struct InterfaceCounter : ICounter
{
public int Value;
public override string ToString ()
{
return Value.ToString ();
}
void ICounter.Increment ()
{
Value++;
}
public void Increment ()
{
Value += 2;
}
}
}
namespace ReferenceTypeCounters
{
public class SimpleCounter : ICounter
{
public int Value;
public void Increment ()
{
Value += 2;
}
}
public class PrintingCounter : ICounter
{
public int Value;
public override string ToString ()
{
return Value.ToString ();
}
public void Increment ()
{
Value += 2;
}
}
public class ExplicitCounter : ICounter
{
public int Value;
public override string ToString ()
{
return Value.ToString ();
}
void ICounter.Increment ()
{
Value++;
}
}
public class InterfaceCounter : ICounter
{
public int Value;
public override string ToString ()
{
return Value.ToString ();
}
void ICounter.Increment ()
{
Value++;
}
public void Increment ()
{
Value += 2;
}
}
}
namespace Test
{
using V = ValueTypeCounters;
using R = ReferenceTypeCounters;
public class Test<T>
where T : ICounter
{
public static void Foo (T x)
{
Console.WriteLine (x.ToString ());
x.Increment ();
Console.WriteLine (x.ToString ());
}
}
public class X
{
public static void Main ()
{
Test<V.SimpleCounter>.Foo (new V.SimpleCounter ());
Test<V.PrintingCounter>.Foo (new V.PrintingCounter ());
Test<V.ExplicitCounter>.Foo (new V.ExplicitCounter ());
Test<V.InterfaceCounter>.Foo (new V.InterfaceCounter ());
Test<R.SimpleCounter>.Foo (new R.SimpleCounter ());
Test<R.PrintingCounter>.Foo (new R.PrintingCounter ());
Test<R.ExplicitCounter>.Foo (new R.ExplicitCounter ());
Test<R.InterfaceCounter>.Foo (new R.InterfaceCounter ());
}
}
}