bool TryConvertEnum(ref ResolveResult rr, IType targetType, ref bool isNullable, ref ResolveResult enumRR, bool allowConversionFromConstantZero = true)
{
Conversion c;
if (!isNullable) {
// Try non-nullable
c = conversions.ImplicitConversion(rr, targetType);
if (c.IsValid && (allowConversionFromConstantZero || !c.IsEnumerationConversion)) {
rr = Convert(rr, targetType, c);
return true;
}
}
// make targetType nullable if it isn't already:
if (!targetType.IsKnownType(KnownTypeCode.NullableOfT))
targetType = NullableType.Create(compilation, targetType);
c = conversions.ImplicitConversion(rr, targetType);
if (c.IsValid && (allowConversionFromConstantZero || !c.IsEnumerationConversion)) {
rr = Convert(rr, targetType, c);
isNullable = true;
// Also convert the enum-typed RR to nullable, if it isn't already
if (!enumRR.Type.IsKnownType(KnownTypeCode.NullableOfT)) {
var nullableType = NullableType.Create(compilation, enumRR.Type);
enumRR = new ConversionResolveResult(nullableType, enumRR, Conversion.ImplicitNullableConversion);
}
return true;
}
return false;
}