import cs.Constraints; import haxe.Constraints.Constructible; @:classCode(" public static void testClass(T t) where T : class {} public static void testStruct(T t) where T : struct {} public static void testConstructible(T t) where T : new() {} public static void testConstructibleClass(T t) where T : class, new() {} ") class TestCs { extern public static function testClass(t:T):Void; extern public static function testStruct(t:T):Void; extern public static function testConstructibleVoid>>(t:T):Void; extern public static function testConstructibleClassVoid> & CsClass>(t:T):Void; } @:nativeGen class Main { public static function main() { testClass(new Array()); TestCs.testClass(new Class_(new Array()).value); testStruct(42); TestCs.testStruct(new Struct(42).value); testConstructible(new haxe.Serializer()); TestCs.testConstructible(new Constructible_(new haxe.Serializer()).value); testConstructibleClass(new haxe.Serializer()); TestCs.testConstructibleClass(new ConstructibleClass(new haxe.Serializer()).value); } static function testClass(value:T) TestCs.testClass(value); static function testStruct(value:T) TestCs.testStruct(value); static function testConstructibleVoid>>(value:T) TestCs.testConstructible(value); static function testConstructibleClassVoid> & CsClass>(value:T) TestCs.testConstructibleClass(value); } @:nativeGen class Class_ { public var value:T; public function new(value:T) this.value = value; } @:nativeGen class Struct { public var value:T; public function new(value:T) this.value = value; } @:nativeGen class Constructible_Void>> { public var value:T; public function new(value:T) this.value = value; } @:nativeGen class ConstructibleClassVoid> & CsClass> { public var value:T; public function new(value:T) this.value = value; } @:nativeGen class StructT {} #if (cs_ver >= "7.3") @:nativeGen class Unmanaged {} @:nativeGen class UnmanagedClass {} #end