258
258
public void UnconstrainedTypeParameter()
260
ITypeParameter t = new DefaultTypeParameter(compilation, EntityType.TypeDefinition, 0, "T");
261
ITypeParameter t2 = new DefaultTypeParameter(compilation, EntityType.TypeDefinition, 1, "T2");
262
ITypeParameter tm = new DefaultTypeParameter(compilation, EntityType.Method, 0, "TM");
260
ITypeParameter t = new DefaultTypeParameter(compilation, SymbolKind.TypeDefinition, 0, "T");
261
ITypeParameter t2 = new DefaultTypeParameter(compilation, SymbolKind.TypeDefinition, 1, "T2");
262
ITypeParameter tm = new DefaultTypeParameter(compilation, SymbolKind.Method, 0, "TM");
264
264
Assert.AreEqual(C.None, conversions.ImplicitConversion(SpecialType.NullType, t));
265
265
Assert.AreEqual(C.BoxingConversion, conversions.ImplicitConversion(t, compilation.FindType(KnownTypeCode.Object)));
277
277
public void TypeParameterWithReferenceTypeConstraint()
279
ITypeParameter t = new DefaultTypeParameter(compilation, EntityType.TypeDefinition, 0, "T", hasReferenceTypeConstraint: true);
279
ITypeParameter t = new DefaultTypeParameter(compilation, SymbolKind.TypeDefinition, 0, "T", hasReferenceTypeConstraint: true);
281
281
Assert.AreEqual(C.NullLiteralConversion, conversions.ImplicitConversion(SpecialType.NullType, t));
282
282
Assert.AreEqual(C.ImplicitReferenceConversion, conversions.ImplicitConversion(t, compilation.FindType(KnownTypeCode.Object)));
288
288
public void TypeParameterWithValueTypeConstraint()
290
ITypeParameter t = new DefaultTypeParameter(compilation, EntityType.TypeDefinition, 0, "T", hasValueTypeConstraint: true);
290
ITypeParameter t = new DefaultTypeParameter(compilation, SymbolKind.TypeDefinition, 0, "T", hasValueTypeConstraint: true);
292
292
Assert.AreEqual(C.None, conversions.ImplicitConversion(SpecialType.NullType, t));
293
293
Assert.AreEqual(C.BoxingConversion, conversions.ImplicitConversion(t, compilation.FindType(KnownTypeCode.Object)));
299
299
public void TypeParameterWithClassConstraint()
301
ITypeParameter t = new DefaultTypeParameter(compilation, EntityType.TypeDefinition, 0, "T",
301
ITypeParameter t = new DefaultTypeParameter(compilation, SymbolKind.TypeDefinition, 0, "T",
302
302
constraints: new[] { compilation.FindType(typeof(StringComparer)) });
304
304
Assert.AreEqual(C.NullLiteralConversion,
321
321
public void TypeParameterWithInterfaceConstraint()
323
ITypeParameter t = new DefaultTypeParameter(compilation, EntityType.TypeDefinition, 0, "T",
323
ITypeParameter t = new DefaultTypeParameter(compilation, SymbolKind.TypeDefinition, 0, "T",
324
324
constraints: new [] { compilation.FindType(typeof(IList)) });
326
326
Assert.AreEqual(C.None, conversions.ImplicitConversion(SpecialType.NullType, t));
500
500
var b = new DefaultUnresolvedTypeDefinition(string.Empty, "B");
501
501
// interface A<in U>
502
502
a.Kind = TypeKind.Interface;
503
a.TypeParameters.Add(new DefaultUnresolvedTypeParameter(EntityType.TypeDefinition, 0, "U") { Variance = VarianceModifier.Contravariant });
503
a.TypeParameters.Add(new DefaultUnresolvedTypeParameter(SymbolKind.TypeDefinition, 0, "U") { Variance = VarianceModifier.Contravariant });
504
504
// interface B<X> : A<A<B<X>>> { }
505
b.TypeParameters.Add(new DefaultUnresolvedTypeParameter(EntityType.TypeDefinition, 0, "X"));
505
b.TypeParameters.Add(new DefaultUnresolvedTypeParameter(SymbolKind.TypeDefinition, 0, "X"));
506
506
b.BaseTypes.Add(new ParameterizedTypeReference(
507
507
a, new[] { new ParameterizedTypeReference(
508
508
a, new [] { new ParameterizedTypeReference(
509
b, new [] { new TypeParameterReference(EntityType.TypeDefinition, 0) }
509
b, new [] { new TypeParameterReference(SymbolKind.TypeDefinition, 0) }
512
512
ICompilation compilation = TypeSystemHelper.CreateCompilation(a, b);
615
615
var c = GetConversion(program);
616
616
Assert.IsTrue(c.IsValid);
617
617
Assert.IsTrue(c.IsMethodGroupConversion);
618
Assert.IsFalse(c.DelegateCapturesFirstArgument);
619
Assert.IsNotNull(c.Method);
623
public void MethodGroupConversion_Void_InstanceMethod()
625
string program = @"using System;
633
var c = GetConversion(program);
634
Assert.IsTrue(c.IsValid);
635
Assert.IsTrue(c.IsMethodGroupConversion);
636
Assert.IsTrue(c.DelegateCapturesFirstArgument);
618
637
Assert.IsNotNull(c.Method);
855
public void MethodGroupConversion_ExtensionMethod()
857
string program = @"using System;
859
public static void M(this string s, int x) {}
862
delegate void D(int a);
868
var c = GetConversion(program);
869
Assert.IsTrue(c.IsValid);
870
Assert.IsTrue(c.IsMethodGroupConversion);
871
Assert.IsTrue(c.DelegateCapturesFirstArgument);
875
public void MethodGroupConversion_ExtensionMethodUsedAsStaticMethod()
877
string program = @"using System;
879
public static void M(this string s, int x) {}
882
delegate void D(string s, int a);
887
var c = GetConversion(program);
888
Assert.IsTrue(c.IsValid);
889
Assert.IsTrue(c.IsMethodGroupConversion);
890
Assert.IsFalse(c.DelegateCapturesFirstArgument);
894
public void MethodGroupConversion_ObjectToDynamic() {
895
string program = @"using System;
897
public void F(object o) {}
899
Action<dynamic> x = $F$;
902
var c = GetConversion(program);
903
Assert.IsTrue(c.IsValid);
907
public void MethodGroupConversion_ObjectToDynamicGenericArgument() {
908
string program = @"using System;
909
using System.Collections.Generic;
911
public void F(List<object> l) {}
913
Action<List<dynamic>> x = $F$;
916
var c = GetConversion(program);
917
Assert.IsTrue(c.IsValid);
921
public void MethodGroupConversion_ObjectToDynamicReturnValue() {
922
string program = @"using System;
926
Func<dynamic> x = $F$;
929
var c = GetConversion(program);
930
Assert.IsTrue(c.IsValid);
934
public void MethodGroupConversion_DynamicToObject() {
935
string program = @"using System;
937
public void F(dynamic o) {}
939
Action<object> x = $F$;
942
var c = GetConversion(program);
943
Assert.IsTrue(c.IsValid);
947
public void MethodGroupConversion_DynamicToObjectGenericArgument() {
948
string program = @"using System;
949
using System.Collections.Generic;
951
public void F(List<dynamic> l) {}
953
Action<List<object>> x = $F$;
956
var c = GetConversion(program);
957
Assert.IsTrue(c.IsValid);
961
public void MethodGroupConversion_DynamicToObjectReturnValue() {
962
string program = @"using System;
964
public dynamic F() {}
966
Func<object> x = $F$;
969
var c = GetConversion(program);
970
Assert.IsTrue(c.IsValid);
836
974
public void UserDefined_IntLiteral_ViaUInt_ToCustomStruct()
838
976
string program = @"using System;
1290
1428
Assert.IsTrue(c.ConversionAfterUserDefinedOperator.IsNumericConversion);
1291
1429
Assert.IsTrue(c.ConversionAfterUserDefinedOperator.IsValid);
1433
public void UserDefinedImplicitConversion_IsImplicit()
1435
// Bug icsharpcode/NRefactory#183: conversions from constant expressions were incorrectly marked as explicit
1436
string program = @"using System;
1438
void Hello(JsNumber3 x) {
1442
public class JsNumber3 {
1443
public static implicit operator JsNumber3(int d) {
1447
var c = GetConversion(program);
1448
Assert.IsTrue(c.IsValid);
1449
Assert.IsTrue(c.IsImplicit);
1450
Assert.IsFalse(c.IsExplicit);
1451
Assert.AreEqual(Conversion.IdentityConversion, c.ConversionBeforeUserDefinedOperator);
1452
Assert.AreEqual(Conversion.IdentityConversion, c.ConversionAfterUserDefinedOperator);