Browse Source

Fixed using implicit user-defined conversions as part of explicit conversions.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
d4df4d9790
  1. 2
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs
  2. 18
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/ExplicitConversionsTest.cs

2
ICSharpCode.NRefactory.CSharp/Resolver/CSharpConversions.cs

@ -788,7 +788,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -788,7 +788,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
// Find the candidate operators:
Predicate<IUnresolvedMethod> opFilter;
if (isExplicit)
opFilter = m => m.IsStatic && m.IsOperator && m.Name == "op_Explicit" && m.Parameters.Count == 1;
opFilter = m => m.IsStatic && m.IsOperator && (m.Name == "op_Explicit" || m.Name == "op_Implicit") && m.Parameters.Count == 1;
else
opFilter = m => m.IsStatic && m.IsOperator && m.Name == "op_Implicit" && m.Parameters.Count == 1;

18
ICSharpCode.NRefactory.Tests/CSharp/Resolver/ExplicitConversionsTest.cs

@ -490,6 +490,24 @@ class C { @@ -490,6 +490,24 @@ class C {
Assert.AreEqual("B", rr.Input.Type.Name);
}
[Test]
public void ImplicitUserDefinedConversionFollowedByExplicitNumericConversion()
{
var rr = Resolve<ConversionResolveResult>(@"
struct T {
public static implicit operator float(T t) { return 0; }
}
class Test {
void Run(T t) {
int x = $(int)t$;
}
}");
Assert.IsTrue(rr.Conversion.IsValid);
Assert.IsTrue(rr.Conversion.IsUserDefined);
// even though the user-defined conversion is implicit, the combined conversion is explicit
Assert.IsTrue(rr.Conversion.IsExplicit);
}
[Test]
[Ignore("Not implemented yet.")]
public void BothDirectConversionAndBaseClassConversionAvailable()

Loading…
Cancel
Save