protected override Expression DoResolve(ResolveContext ec)
{
//
// It's null when lifting non-nullable type
//
if (unwrap == null)
{
// S -> T? is wrap only
if (type.IsNullableType)
{
return(Wrap.Create(expr, type));
}
// S -> T can be simplified
return(expr);
}
// Wrap target for T?
if (type.IsNullableType)
{
if (!expr.Type.IsNullableType)
{
expr = Wrap.Create(expr, type);
if (expr == null)
{
return(null);
}
}
null_value = LiftedNull.Create(type, loc);
}
else if (TypeSpec.IsValueType(type))
{
null_value = LiftedNull.Create(type, loc);
}
else
{
null_value = new NullConstant(type, loc);
}
eclass = ExprClass.Value;
return(this);
}