SaveChanges() { this.SaveChanges() }
SaveChanges(string x = null) { /*...*/ base.SaveChanges() }
// ***********
SaveChanges()
którą metodę wywoła?
SaveChanges() { this.SaveChanges() }
SaveChanges(string x = null) { /*...*/ base.SaveChanges() }
// ***********
SaveChanges()
którą metodę wywoła?
Tą bezparametrową
class A
{
public void SaveChanges()
{
Console.WriteLine("A:SaveChanges");
}
}
class B : A
{
public void SaveChanges()
{
Console.WriteLine("B:SaveChanges");
this.SaveChanges();
}
public void SaveChanges(string x = null)
{
Console.WriteLine("B:SaveChanges(string)");
base.SaveChanges();
}
}
class App
{
public static void Main()
{
var test = new B();
test.SaveChanges();
}
}
Zapętla się w nieskończoność!
using System;
class A
{
public virtual void SaveChanges()
{
Console.WriteLine("A:SaveChanges");
}
}
class B : A
{
public override void SaveChanges()
{
Console.WriteLine("B:SaveChanges");
this.SaveChanges();
}
public void SaveChanges(string x = null)
{
Console.WriteLine("B:SaveChanges(string)");
base.SaveChanges();
}
}
class App
{
public static void Main()
{
var test = new B();
test.SaveChanges();
// B:SaveChanges(string)
// A:SaveChanges
}
}
Wyjście:
B:SaveChanges(string)
A:SaveChanges
SaveChanges() którą metodę wywoła?
A tak trudno sprawdzić?
istnienie tych 2 metod kolo siebie to po prostu fail, zamiast sie zastanawiac ktora sie wywola po prostu jedna wywal i problem z glowy.
odpowiadajac na pytanie - metoda bez parametrow ma wyzszy priorytet jesli chodzi o wywolanie.
To jest fragment kontekstu aplikacji w firmie.
Piszę testy i nie można wywołać metod SaveChanges() na zmockowanym konstekscie ponieważ nie obsługuje paraemtrów opcjonalnych.
VS pokazuje 140 referencji(odwołań) do SaveChanges() a 0 do SaveChanges(string x= null) a wywoływana jest ta druga.
Logicznie biorąc powinna wywołać się pierwsza ale wywoływana jest przeciążona dlaczego?
class A
{
public virtual void SaveChanges()
{
Console.WriteLine("A:SaveChanges");
}
}
class B : A
{
public override void SaveChanges()
{
Console.WriteLine("B:SaveChanges");
}
public void SaveChanges(string x = null)
{
Console.WriteLine("B:SaveChanges(string)");
}
}
class Program
{
static void Main(string[] args)
{
var test = new B();
test.SaveChanges();
Console.ReadLine();
}
}
A.SaveChanges:
IL_0000: nop
IL_0001: ldstr "A:SaveChanges"
IL_0006: call System.Console.WriteLine
IL_000B: nop
IL_000C: ret
A..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
B.SaveChanges:
IL_0000: nop
IL_0001: ldstr "B:SaveChanges"
IL_0006: call System.Console.WriteLine
IL_000B: nop
IL_000C: ret
B.SaveChanges:
IL_0000: nop
IL_0001: ldstr "B:SaveChanges(string)"
IL_0006: call System.Console.WriteLine
IL_000B: nop
IL_000C: ret
B..ctor:
IL_0000: ldarg.0
IL_0001: call UserQuery+A..ctor
IL_0006: ret
Program.Main:
IL_0000: nop
IL_0001: newobj UserQuery+B..ctor
IL_0006: stloc.0 // test
IL_0007: ldloc.0 // test
IL_0008: ldnull
IL_0009: callvirt UserQuery+B.SaveChanges
IL_000E: nop
IL_000F: call System.Console.ReadLine
IL_0014: pop
IL_0015: ret
Program..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
W kodzie IL jest napisane że ma wywołać :
callvirt UserQuery+B.SaveChanges
nikt nie wie?
Logicznie biorąc powinna wywołać się pierwsza ale wywoływana jest przeciążona dlaczego?
A co to kogo... ważniejsze jest pytanie: PO CO w projekcie istnieją obie na raz?
Piszę testy i nie można wywołać metod SaveChanges() na zmockowanym konstekscie ponieważ nie obsługuje paraemtrów opcjonalnych.
Ale można chyba wywołać SaveChanges(null)
...