Programmerare, skeptiker, sekulärhumanist, antirasist.
Författare till bok om C64 och senbliven lantis.
Röstar pirat.
2023-08-15
I C# kan standardvärden (default value) på en parameter i en metod sättas både i själva metoddeklarationen i klassen som håller metoden och i eventuella interfaces som klassen ärver ifrån. Dessa standardvärden behöver inte stämma överens med varandra, så vilket är det som gäller? Det är inte instansens typ utan variabelns typ som avgör parameterns standardvärde. Det innebär att man kan typomvandla för att styra vilka parametrar som skickas till en metod. Här är det de upprepade typomvandlingarna som gör att resultatet blir Good Day To You Sir:
var a = new A();
(a as B).X();
(a as C).X();
(a as D).X();
(a as E).X();
(a as F).X();
class A : B, C, D, E, F
{
public void X(string y) => Console.WriteLine(y);
}
interface B { void X(string y = "Good"); }
interface C { void X(string y = "Day"); }
interface D { void X(string y = "To"); }
interface E { void X(string y = "You"); }
interface F { void X(string y = "Sir"); }
Vill man vara riktigt äventyrlig så kan man skriva en iteration som tittar på den exakta arvslistan som är placerad på klassen A. Här är det den kommaseparerade listan som avgör vilket standardvärde som används.
var a = new A();
foreach (var p in typeof(A).GetInterfaces())
{
var m = p.GetMethods().Where(p => p.Name == "X").First();
m.Invoke(a, new[] { m.GetParameters().First().DefaultValue });
}
class A : B, C, D, E, F
{
public void X(string y) => Console.WriteLine(y);
}
interface B { void X(string y = "Good"); }
interface C { void X(string y = "Day"); }
interface D { void X(string y = "To"); }
interface E { void X(string y = "You"); }
interface F { void X(string y = "Sir"); }
Resultatet är återigen Good Day To You Sir. Egentligen inte helt ologiskt, om du någon gång funderar på vad som styr vilket standardvärde som skickas till parametern i din funktion, så titta på variabelns typ.
Categories: C#
Bjud mig på en kopp kaffe (20:-) som tack för bra innehåll!
Leave a Reply