Metody przeciążone - która zostanie wywołana?

0
 SaveChanges() { this.SaveChanges() }
SaveChanges(string x = null) { /*...*/ base.SaveChanges() }

// ***********

SaveChanges() którą metodę wywoła?

0

Tą bezparametrową

0
 
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

2

SaveChanges() którą metodę wywoła?

A tak trudno sprawdzić?

1

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.

0

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?

0
 
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
0

nikt nie wie?

0

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)...

1 użytkowników online, w tym zalogowanych: 0, gości: 1