Projemizde sahip olduğumuz bir sorunla karıştırıldım. Ben etkiyi çoğaltmak için basitleştirmek için çalıştı:C# Yöntem aşırı yükleme ve genel arayüz
interface IBar { }
class Bar : IBar {}
interface IFoo<T> where T : IBar { }
class Foo<T> : IFoo<T> where T : IBar { }
class Class1
{
public void DoTheFoo<T>(T bar) where T : IBar
{}
public void DoTheFoo<T>(IFoo<T> foo) where T : IBar
{}
public void Test()
{
var bar = new Bar();
var foo = new Foo<Bar>();
DoTheFoo(bar); // works
DoTheFoo<Bar>(foo); // works
DoTheFoo((IFoo<Bar>)foo); // works
DoTheFoo(foo); // complains
}
}
bu iyi görünüyor Bana göre, ancak DoTheFoo<T>(IFoo<T> foo)
yerine, DoTheFoo<T>(T bar)
çalışır ve argüman türü uymuyor şikayet çünkü derleyici, son çağrı şikayet .
DoTheFoo<T>(T bar)
yöntemini kaldırdığımda, son çağrı çalışıyor!- Ben
DoTheFoo<T>(Foo<T> foo)
olarak değiştirin, bu çalışıyor, ama bizim şimdiki kodunda bu geçici bir çözüm için çok zor değil
olduğunu kullanamaz. Ama a) tuhaf ve b) çok fazla kötü olan bu iki aşırı metoda sahip olamayız.
Bu davranışı açıklayan ortak bir kural var mı? Çalışmasını sağlamak mümkün mü (yöntemleri farklı isimler vermek dışında)?
Bunun bir kopya olduğunu sanmıyorum. Genel kısıtlamalarda yöntemlerin farklı olması sorunu vardır. Yöntemler, bildirilen bağımsız değişken türünde farklıdır. –
Hayır, bu bir kopya. Cevabımı dikkatlice oku. Aşırı yük çözünürlüğünün sizin durumunuzda neden yöntemi seçtiğini açıklar. –