Binder\Binder_Operators.cs (43)
3228return new BoundIsOperator(node, operand, typeExpression, ConversionKind.NoConversion, resultType, hasErrors: true);
3310ConversionKind conversionKind,
3345ConversionKind conversionKind,
3399case ConversionKind.NoConversion:
3486case ConversionKind.ImplicitNumeric:
3487case ConversionKind.ExplicitNumeric:
3488case ConversionKind.ImplicitEnumeration:
3490case ConversionKind.ImplicitConstant:
3491case ConversionKind.ImplicitUserDefined:
3492case ConversionKind.ExplicitUserDefined:
3493case ConversionKind.IntPtr:
3494case ConversionKind.ExplicitTuple:
3495case ConversionKind.ImplicitTuple:
3511case ConversionKind.ExplicitEnumeration:
3516goto case ConversionKind.NoConversion;
3521case ConversionKind.ExplicitNullable:
3552case ConversionKind.ImplicitReference:
3555case ConversionKind.ExplicitReference:
3556case ConversionKind.Unboxing:
3563case ConversionKind.Identity:
3570case ConversionKind.Boxing:
3587case ConversionKind.ImplicitNullable:
3600case ConversionKind.ImplicitDynamic:
3601case ConversionKind.ExplicitDynamic:
3602case ConversionKind.ExplicitPointerToInteger:
3603case ConversionKind.ExplicitPointerToPointer:
3604case ConversionKind.ImplicitPointerToVoid:
3605case ConversionKind.ExplicitIntegerToPointer:
3606case ConversionKind.ImplicitNullToPointer:
3607case ConversionKind.AnonymousFunction:
3608case ConversionKind.NullLiteral:
3609case ConversionKind.DefaultLiteral:
3610case ConversionKind.MethodGroup:
3778ConversionKind conversionKind,
3804case ConversionKind.ImplicitReference:
3805case ConversionKind.Boxing:
3806case ConversionKind.ImplicitNullable:
3807case ConversionKind.Identity:
3808case ConversionKind.ExplicitNullable:
3809case ConversionKind.ExplicitReference:
3810case ConversionKind.Unboxing:
3840ConversionKind conversionKind,
3869internal static ConstantValue GetAsOperatorConstantResult(TypeSymbol operandType, TypeSymbol targetType, ConversionKind conversionKind, ConstantValue operandConstantValue)
Binder\Semantics\Conversions\Conversion.cs (117)
21private readonly ConversionKind _kind;
92ConversionKind kind,
99private Conversion(ConversionKind kind)
107? ConversionKind.NoConversion
108: isImplicit ? ConversionKind.ImplicitUserDefined : ConversionKind.ExplicitUserDefined;
119internal Conversion(ConversionKind kind, MethodSymbol conversionMethod, bool isExtensionMethod)
130internal Conversion(ConversionKind kind, ImmutableArray<Conversion> nestedConversions)
141internal Conversion(ConversionKind kind, DeconstructMethodInfo deconstructMethodInfo, ImmutableArray<(BoundValuePlaceholder? placeholder, BoundExpression? conversion)> deconstructConversionInfo)
143Debug.Assert(kind == ConversionKind.Deconstruction);
156Debug.Assert(_kind is ConversionKind.MethodGroup or ConversionKind.IntPtr or ConversionKind.ImplicitUserDefined or ConversionKind.ExplicitUserDefined);
177private static void AssertTrivialConversion(ConversionKind kind)
183case ConversionKind.NoConversion:
184case ConversionKind.Identity:
185case ConversionKind.ImplicitConstant:
186case ConversionKind.ImplicitNumeric:
187case ConversionKind.ImplicitReference:
188case ConversionKind.ImplicitEnumeration:
189case ConversionKind.ImplicitThrow:
190case ConversionKind.AnonymousFunction:
191case ConversionKind.Boxing:
192case ConversionKind.NullLiteral:
193case ConversionKind.DefaultLiteral:
194case ConversionKind.ImplicitNullToPointer:
195case ConversionKind.ImplicitPointerToVoid:
196case ConversionKind.ExplicitPointerToPointer:
197case ConversionKind.ExplicitPointerToInteger:
198case ConversionKind.ExplicitIntegerToPointer:
199case ConversionKind.Unboxing:
200case ConversionKind.ExplicitReference:
201case ConversionKind.IntPtr:
202case ConversionKind.ExplicitEnumeration:
203case ConversionKind.ExplicitNumeric:
204case ConversionKind.ImplicitDynamic:
205case ConversionKind.ExplicitDynamic:
206case ConversionKind.InterpolatedString:
207case ConversionKind.InterpolatedStringHandler:
219internal static Conversion GetTrivialConversion(ConversionKind kind)
225internal static Conversion UnsetConversion => new Conversion(ConversionKind.UnsetConversionKind);
226internal static Conversion NoConversion => new Conversion(ConversionKind.NoConversion);
227internal static Conversion Identity => new Conversion(ConversionKind.Identity);
228internal static Conversion ImplicitConstant => new Conversion(ConversionKind.ImplicitConstant);
229internal static Conversion ImplicitNumeric => new Conversion(ConversionKind.ImplicitNumeric);
230internal static Conversion ImplicitReference => new Conversion(ConversionKind.ImplicitReference);
231internal static Conversion ImplicitEnumeration => new Conversion(ConversionKind.ImplicitEnumeration);
232internal static Conversion ImplicitThrow => new Conversion(ConversionKind.ImplicitThrow);
233internal static Conversion ObjectCreation => new Conversion(ConversionKind.ObjectCreation);
234internal static Conversion AnonymousFunction => new Conversion(ConversionKind.AnonymousFunction);
235internal static Conversion Boxing => new Conversion(ConversionKind.Boxing);
236internal static Conversion NullLiteral => new Conversion(ConversionKind.NullLiteral);
237internal static Conversion DefaultLiteral => new Conversion(ConversionKind.DefaultLiteral);
238internal static Conversion NullToPointer => new Conversion(ConversionKind.ImplicitNullToPointer);
239internal static Conversion PointerToVoid => new Conversion(ConversionKind.ImplicitPointerToVoid);
240internal static Conversion PointerToPointer => new Conversion(ConversionKind.ExplicitPointerToPointer);
241internal static Conversion PointerToInteger => new Conversion(ConversionKind.ExplicitPointerToInteger);
242internal static Conversion IntegerToPointer => new Conversion(ConversionKind.ExplicitIntegerToPointer);
243internal static Conversion Unboxing => new Conversion(ConversionKind.Unboxing);
244internal static Conversion ExplicitReference => new Conversion(ConversionKind.ExplicitReference);
245internal static Conversion IntPtr => new Conversion(ConversionKind.IntPtr);
246internal static Conversion ExplicitEnumeration => new Conversion(ConversionKind.ExplicitEnumeration);
247internal static Conversion ExplicitNumeric => new Conversion(ConversionKind.ExplicitNumeric);
248internal static Conversion ImplicitDynamic => new Conversion(ConversionKind.ImplicitDynamic);
249internal static Conversion ExplicitDynamic => new Conversion(ConversionKind.ExplicitDynamic);
250internal static Conversion InterpolatedString => new Conversion(ConversionKind.InterpolatedString);
251internal static Conversion InterpolatedStringHandler => new Conversion(ConversionKind.InterpolatedStringHandler);
252internal static Conversion Deconstruction => new Conversion(ConversionKind.Deconstruction);
253internal static Conversion PinnedObjectToPointer => new Conversion(ConversionKind.PinnedObjectToPointer);
254internal static Conversion ImplicitPointer => new Conversion(ConversionKind.ImplicitPointer);
255internal static Conversion FunctionType => new Conversion(ConversionKind.FunctionType);
280return new Conversion(ConversionKind.StackAllocToPointerType, ImmutableArray.Create(underlyingConversion));
285return new Conversion(ConversionKind.StackAllocToSpanType, ImmutableArray.Create(underlyingConversion));
288internal static Conversion MakeNullableConversion(ConversionKind kind, Conversion nestedConversion)
290Debug.Assert(kind == ConversionKind.ImplicitNullable || kind == ConversionKind.ExplicitNullable);
295case ConversionKind.Identity:
298case ConversionKind.ImplicitConstant:
301case ConversionKind.ImplicitNumeric:
304case ConversionKind.ExplicitNumeric:
307case ConversionKind.ExplicitEnumeration:
310case ConversionKind.ExplicitPointerToInteger:
323return new Conversion(ConversionKind.SwitchExpression, innerConversions);
328return new Conversion(ConversionKind.ConditionalExpression, innerConversions);
331internal ConversionKind Kind
526return Kind != ConversionKind.NoConversion;
569return Kind == ConversionKind.Identity;
580return Kind == ConversionKind.StackAllocToPointerType || Kind == ConversionKind.StackAllocToSpanType;
594return Kind == ConversionKind.ImplicitNumeric || Kind == ConversionKind.ExplicitNumeric;
608return Kind == ConversionKind.ImplicitEnumeration || Kind == ConversionKind.ExplicitEnumeration;
619return Kind == ConversionKind.ImplicitThrow;
630return Kind == ConversionKind.ObjectCreation;
641return Kind == ConversionKind.SwitchExpression;
652return Kind == ConversionKind.ConditionalExpression;
667return Kind == ConversionKind.InterpolatedString;
678return Kind == ConversionKind.InterpolatedStringHandler;
692return Kind == ConversionKind.ImplicitNullable || Kind == ConversionKind.ExplicitNullable;
703return Kind == ConversionKind.ImplicitTupleLiteral || Kind == ConversionKind.ExplicitTupleLiteral;
714return Kind == ConversionKind.ImplicitTuple || Kind == ConversionKind.ExplicitTuple;
728return Kind == ConversionKind.ImplicitReference || Kind == ConversionKind.ExplicitReference;
756return Kind == ConversionKind.Boxing;
770return Kind == ConversionKind.Unboxing;
784return Kind == ConversionKind.NullLiteral;
795return Kind == ConversionKind.DefaultLiteral;
823return Kind == ConversionKind.ImplicitConstant;
837return Kind == ConversionKind.AnonymousFunction;
851return Kind == ConversionKind.MethodGroup;
897return Kind == ConversionKind.IntPtr;
953return this.Kind == ConversionKind.NoConversion ? LookupResultKind.Empty : LookupResultKind.Viable;
Binder\Semantics\Conversions\ConversionsBase.cs (73)
481ConversionKind convKind = ConversionEasyOut.ClassifyConversion(source, target);
482if (convKind != ConversionKind.ImplicitNullable && convKind != ConversionKind.ExplicitNullable)
574private static bool IsStandardImplicitConversionFromExpression(ConversionKind kind)
586case ConversionKind.AnonymousFunction:
587case ConversionKind.MethodGroup:
588case ConversionKind.ImplicitEnumeration:
589case ConversionKind.ImplicitDynamic:
590case ConversionKind.ImplicitNullToPointer:
591case ConversionKind.ImplicitTupleLiteral:
592case ConversionKind.StackAllocToPointerType:
593case ConversionKind.StackAllocToSpanType:
602private static bool IsStandardImplicitConversionFromType(ConversionKind kind)
606case ConversionKind.Identity:
607case ConversionKind.ImplicitNumeric:
608case ConversionKind.ImplicitNullable:
609case ConversionKind.ImplicitReference:
610case ConversionKind.Boxing:
611case ConversionKind.ImplicitConstant:
612case ConversionKind.ImplicitPointer:
613case ConversionKind.ImplicitPointerToVoid:
614case ConversionKind.ImplicitTuple:
676Debug.Assert(conversion.Kind == ConversionKind.NoConversion || IsStandardImplicitConversionFromType(conversion.Kind));
858case ConversionKind.Identity:
861case ConversionKind.ImplicitNumeric:
864case ConversionKind.ImplicitReference:
867case ConversionKind.Boxing:
870case ConversionKind.NoConversion:
873case ConversionKind.ImplicitPointerToVoid:
877case ConversionKind.ImplicitTuple:
883case ConversionKind.ImplicitNullable:
891Conversion.MakeNullableConversion(ConversionKind.ExplicitNullable, underlyingConversion) :
978case ConversionKind.ImplicitUserDefined:
979case ConversionKind.ImplicitDynamic:
980case ConversionKind.ImplicitTuple:
981case ConversionKind.ImplicitTupleLiteral:
982case ConversionKind.ImplicitNullable:
983case ConversionKind.ConditionalExpression:
1205return new Conversion(ConversionKind.ImplicitNullable, Conversion.ImplicitConstantUnderlying);
1235return new Conversion(ConversionKind.ImplicitNullable, ImmutableArray.Create(underlyingTupleConversion));
1266return new Conversion(ConversionKind.ExplicitNullable, ImmutableArray.Create(underlyingTupleConversion));
1754ClassifyImplicitConversionFromType(source.Type, destination.Type, ref discardedUseSiteInfo).Kind != ConversionKind.NoConversion;
1812ConversionKind.ImplicitTupleLiteral,
1829ConversionKind.ImplicitTuple,
1859case ConversionKind.Identity:
1860case ConversionKind.Boxing:
1861case ConversionKind.ImplicitReference:
1864case ConversionKind.ImplicitTuple:
1865case ConversionKind.ImplicitTupleLiteral:
1878Debug.Assert(conversion.Kind == ConversionKind.NoConversion);
1885private static ConversionKind GetNumericConversion(TypeSymbol source, TypeSymbol destination)
1892return ConversionKind.UnsetConversionKind;
1899return ConversionKind.UnsetConversionKind;
1902var conversionKind = ConversionEasyOut.ClassifyConversion(source, destination);
1903Debug.Assert(conversionKind is ConversionKind.ImplicitNumeric or ConversionKind.ExplicitNumeric);
1909return GetNumericConversion(source, destination) == ConversionKind.ImplicitNumeric;
1916return GetNumericConversion(source, destination) == ConversionKind.ExplicitNumeric;
2115return new Conversion(ConversionKind.ImplicitNullable, Conversion.IdentityUnderlying);
2120return new Conversion(ConversionKind.ImplicitNullable, Conversion.ImplicitNumericUnderlying);
2126return new Conversion(ConversionKind.ImplicitNullable, ImmutableArray.Create(tupleConversion));
2146ConversionKind.ImplicitTupleLiteral,
2164ConversionKind.ExplicitTupleLiteral,
2175ConversionKind kind,
2217ConversionKind.ImplicitTuple,
2236ConversionKind.ExplicitTuple,
2253ConversionKind kind,
2307return new Conversion(ConversionKind.ExplicitNullable, Conversion.IdentityUnderlying);
2312return new Conversion(ConversionKind.ExplicitNullable, Conversion.ImplicitNumericUnderlying);
2317return new Conversion(ConversionKind.ExplicitNullable, Conversion.ExplicitNumericUnderlying);
2323return new Conversion(ConversionKind.ExplicitNullable, ImmutableArray.Create(tupleConversion));
2328return new Conversion(ConversionKind.ExplicitNullable, Conversion.ExplicitEnumerationUnderlying);
2333return new Conversion(ConversionKind.ExplicitNullable, Conversion.PointerToIntegerUnderlying);
Binder\Semantics\OverloadResolution\OverloadResolution.cs (14)
1792if (allSame && Conversions.ClassifyImplicitConversionFromType(type1Normalized, type2Normalized, ref useSiteInfo).Kind != ConversionKind.Identity)
1801if (Conversions.ClassifyImplicitConversionFromType(type1Normalized, type2Normalized, ref useSiteInfo).Kind != ConversionKind.Identity)
1916if (Conversions.ClassifyImplicitConversionFromType(type1Normalized, type2Normalized, ref useSiteInfo).Kind != ConversionKind.Identity)
2134return conversionsOpt.Any(static c => c.Kind == ConversionKind.FunctionType);
2407return conv1.Kind == ConversionKind.Identity ? BetterResult.Left : BetterResult.Neither;
2411return conv2.Kind == ConversionKind.Identity ? BetterResult.Right : BetterResult.Neither;
2463case (ConversionKind.InterpolatedStringHandler, ConversionKind.InterpolatedStringHandler):
2465case (ConversionKind.InterpolatedStringHandler, _):
2467case (_, ConversionKind.InterpolatedStringHandler):
2474case (ConversionKind.FunctionType, ConversionKind.FunctionType):
2476case (_, ConversionKind.FunctionType):
2478case (ConversionKind.FunctionType, _):
Compilation\CSharpSemanticModel.cs (10)
2122conversion = new Conversion(ConversionKind.AnonymousFunction, lambda.Symbol, false);
2152if (highestBoundExpr is BoundConversion { ConversionKind: ConversionKind.SwitchExpression, Conversion: var convertedSwitchConversion })
2170if (highestBoundExpr is BoundConversion { ConversionKind: ConversionKind.ConditionalExpression })
2196if (conversion.Kind == ConversionKind.AnonymousFunction)
2220conversion = new Conversion(ConversionKind.MethodGroup, delegateCreation.MethodOpt, delegateCreation.IsExtensionMethod);
2226conversion = new Conversion(ConversionKind.AnonymousFunction, lambda.Symbol, delegateCreation.IsExtensionMethod);
2232conversion = new Conversion(ConversionKind.AnonymousFunction, lambda.Symbol, delegateCreation.IsExtensionMethod);
2240else if (boundExpr is BoundConversion { ConversionKind: ConversionKind.MethodGroup, Conversion: var exprConversion, Type: { TypeKind: TypeKind.FunctionPointer }, SymbolOpt: var symbol })
3521if ((conversion.ConversionKind == ConversionKind.MethodGroup) && conversion.IsExtensionMethod)
4285Debug.Assert(conversion.ConversionKind == ConversionKind.MethodGroup);