J'ai les deux classes suivantes :
public class Parent
{
public static Parent operator +(Parent l, Parent r)
{
return new Parent(); //do something meaningful
}
}
public class Child: Parent
{
public static Child operator +(Child l, Parent r)
{
return new Child(); //do something meaningful, child related
}
}
J'ai ensuite une classe qui utilise implicit
pour renvoyer la valeur enveloppée :
public class Wrapper<T>
{
private T value;
public T Value => value;
public static implicit operator T(Wrapper<T> wrapper)
{
return wrapper.value;
}
}
Ensuite, je combine les deux comme suit :
public class Usage
{
private Parent someField;
private Wrapper<Child> wrappedValue;
public void UseOperatorWithImplicitConversion()
{
//Child sum1 = wrappedValue + someField; //<-- compilation error
Parent sum2 = wrappedValue + someField;
Child temp = wrappedValue; //works but defeats the purpose of reduced verbosity
Child sum3 = temp + someField;
}
}
Je m'attendais à ce que le sum1
pour travailler. J'ai jeté un coup d'œil dans l'IL généré et il semble que les types soient présents :
IL_0001: ldarg.0 // this
IL_0002: ldfld class Example.Wrapper`1<class Example.Child> Example.Usage::wrappedValue
IL_0007: call !0/*class Example.Child*/ class Example.Wrapper`1<class Example.Child>::op_Implicit(class Example.Wrapper`1<!0/*class Example.Child*/>)
IL_000c: ldarg.0 // this
IL_000d: ldfld class Example.Parent Example.Usage::someField
IL_0012: call class Example.Parent Example.Parent::op_Addition(class Example.Parent, class Example.Parent)
IL_0017: stloc.0 // sum2
Bien que le IL_0012
est un appel à op_Addition
de la Parent
et non le Child
.
Y a-t-il quelque chose qui m'échappe ?
J'utilise .NET Framework 4.6.1 C# 7.2