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

Metody przeciążone - która zostanie wywołana?
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
 SaveChanges() { this.SaveChanges() }
SaveChanges(string x = null) { /*...*/ base.SaveChanges() }

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

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

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0

Tą bezparametrową

CL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 12
0
Kopiuj
 
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ść!

Kopiuj
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

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
2

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

A tak trudno sprawdzić?

katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
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.

  • Rejestracja: dni
  • Ostatnio: dni
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?

T2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 194
0
Kopiuj
 
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();
        }
    }
Kopiuj
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ć :

Kopiuj
callvirt    UserQuery+B.SaveChanges
  • Rejestracja: dni
  • Ostatnio: dni
0

nikt nie wie?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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)...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.