提交 b411c1c0 编写于 作者: A AlekseyTs

Merge pull request #4317 from AlekseyTs/Issue4132

Properly adjust result type of a user-defined conversion for lifted case.
......@@ -554,11 +554,23 @@ private BoundExpression MakeImplicitConversion(BoundExpression rewrittenOperand,
@checked);
}
TypeSymbol userDefinedConversionRewrittenType = conversion.Method.ReturnType;
if (rewrittenOperand.Type != conversion.Method.ParameterTypes[0])
{
Debug.Assert(rewrittenOperand.Type.IsNullableType());
Debug.Assert(rewrittenOperand.Type.GetNullableUnderlyingType() == conversion.Method.ParameterTypes[0]);
Debug.Assert(!userDefinedConversionRewrittenType.IsNullableType());
// Lifted conversion, wrap return type in Nullable
userDefinedConversionRewrittenType = ((NamedTypeSymbol)rewrittenOperand.Type.OriginalDefinition).Construct(userDefinedConversionRewrittenType);
}
BoundExpression userDefined = RewriteUserDefinedConversion(
syntax,
rewrittenOperand,
conversion.Method,
conversion.Method.ReturnType,
userDefinedConversionRewrittenType,
conversion.Kind);
if (userDefined.Type != conversion.BestUserDefinedConversionAnalysis.ToType)
......
......@@ -8676,5 +8676,57 @@ public static void Main (string[] args)
System.Int32
");
}
[Fact, WorkItem(4132, "https://github.com/dotnet/roslyn/issues/4132")]
public void Issue4132()
{
string source = @"
using System;
namespace NullableMathRepro
{
class Program
{
static void Main(string[] args)
{
int? x = 0;
x += 5;
Console.WriteLine(""'x' is {0}"", x);
IntHolder? y = 0;
y += 5;
Console.WriteLine(""'y' is {0}"", y);
}
}
struct IntHolder
{
private int x;
public static implicit operator int (IntHolder ih)
{
Console.WriteLine(""operator int (IntHolder ih)"");
return ih.x;
}
public static implicit operator IntHolder(int i)
{
Console.WriteLine(""operator IntHolder(int i)"");
return new IntHolder { x = i };
}
public override string ToString()
{
return x.ToString();
}
}
}";
CompileAndVerify(source: source, expectedOutput:
@"'x' is 5
operator IntHolder(int i)
operator int (IntHolder ih)
operator IntHolder(int i)
'y' is 5");
}
}
}
......@@ -2701,9 +2701,68 @@ Position get for item 'Foo'
Position set for item 'Foo'
False
False
]]>)
End Sub
<Fact, WorkItem(4132, "https://github.com/dotnet/roslyn/issues/4132")>
Public Sub Issue4132()
Dim compilationDef =
<compilation>
<file name="a.vb">
Imports System
Namespace NullableMathRepro
Module Program
Sub Main()
Dim x As Integer? = 0
x += 5
Console.WriteLine("'x' is {0}", x)
Dim y As IntHolder? = 0
y += 5
Console.WriteLine("'y' is {0}", y)
End Sub
End Module
Structure IntHolder
Private x As Integer
Public Shared Widening Operator CType(ih As IntHolder) As Integer
Console.WriteLine("operator int (IntHolder ih)")
Return ih.x
End Operator
Public Shared Widening Operator CType(i As Integer) As IntHolder
Console.WriteLine("operator IntHolder(int i)")
Return New IntHolder With {.x = i}
End Operator
Public Shared Operator +(x As IntHolder, y As Integer) As Integer
Return CInt(x) + y
End Operator
Public Overrides Function ToString() As String
Return x.ToString()
End Function
End Structure
End Namespace
</file>
</compilation>
Dim compilation = CompilationUtils.CreateCompilationWithMscorlibAndVBRuntime(compilationDef, TestOptions.ReleaseExe)
CompileAndVerify(compilation,
<![CDATA[
'x' is 5
operator IntHolder(int i)
operator int (IntHolder ih)
operator IntHolder(int i)
'y' is 5
]]>)
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册