Belirsiz olmayan garip bir duruma rastladım, ancak aşırı yük çözücü bunu düşünmüyor. Düşünün:Neden bu durumda C# doğru aşırı yükü çözemiyor?
public static class Program
{
delegate int IntDel();
delegate string StringDel();
delegate void ParamIntDel(int x);
delegate void ParamStringDel(string x);
static void Test(IntDel fun) { }
static void Test(StringDel fun) { }
static void ParamTest(ParamIntDel fun) { }
static void ParamTest(ParamStringDel fun) { }
static int X() { return 42; }
static void PX(int x) { }
public static void Main(string[] args)
{
ParamTest(PX); // OK
Test(X); // Ambiguos call!
}
}
Nasıl ParamTest
aşırı çağrısı gelip doğru çözülürse ancak Test
aşırı belirsiz?
Derleyici bir aşırı yükleme seçtiğinde, bir yöntemin dönüş türü dikkate alınmaz. Bir yöntemi çağırdığınızda gerçekte dönüş değerini kullanmamanın otomatik bir sonucu. Burada önemsiz bir şekilde çözüldü, sadece “Test (yeni IntDel (X)) kullanın” –
Bunun Java ve C++ için de geçerli olduğuna inanıyorum. Ancak, parametrik polimorfizmin temel bir sınırlaması değildir, örneğin Haskell'de geri dönüş türüne göre aşırı yüklenebilirsiniz. Sorun, dönüş türüne aşırı yüklenmeye izin verilmesi, tür çıkarımında bazı sorunlara neden olabilir. – Bakuriu
Offtopic: Bugünlerde neredeyse her sorunun en az 1 yakın oyu nasıl alacağına bayılıyorum. XD –