Jestem zdezorientowany przez problem, który mamy w naszym projekcie. Próbowałem uprościć go odtworzyć efekt:C# Metoda przeciążania i ogólny interfejs
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
}
}
Dla mnie to wygląda dobrze, ale kompilator narzeka na ostatniej rozmowy, ponieważ próbuje DoTheFoo<T>(T bar)
zamiast DoTheFoo<T>(IFoo<T> foo)
i skarży się, że rodzaj argumentu nie pasuje .
- Po usunięciu metody
DoTheFoo<T>(T bar)
, ostatnie połączenie działa! - Kiedy go zmienić na
DoTheFoo<T>(Foo<T> foo)
, to działa, ale nie mogę użyć tego
To nie jest zbyt trudne, aby obejść ten problem w naszym aktualnym kodzie. Ale jest to a) dziwne i b) szkoda, że nie możemy mieć tych dwóch przeciążonych metod.
Czy istnieje wspólna reguła wyjaśniająca to zachowanie? Czy to możliwe, aby działało (z wyjątkiem podawania różnych nazw)?
Nie sądzę, że jest to duplikat. Istnieje problem, że metody różnią się w ogólnych ograniczeniach. Moje metody różnią się w zadeklarowanym typie argumentu. –
Nie, to duplikat. Przeczytaj uważnie moją odpowiedź. Wyjaśnia, dlaczego rozdzielczość przeciążania wybiera metodę, którą robi w twoim przypadku. –