Nazywa się to "implementacją jawnego interfejsu". Przyczyną tego może być na przykład konflikt nazw.
Rozważ interfejsy: IEnumerable
i IEnumerable<T>
. Jeden deklaruje nierodzajową metoda
IEnumerator GetEnumerator();
a drugi Generic One:
IEnumerator<T> GetEnumerator();
w C# to nie może mieć dwóch metod o tej samej nazwie, które różnią się tylko w tam typ zwracany. Więc jeśli realizować oba interfejsy, trzeba zadeklarować jeden sposób wyraźny:
public class MyEnumerable<T> : IEnumerable, IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
... // return an enumerator
}
// Note: no access modifiers allowed for explicit declaration
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator(); // call the generic method
}
}
Jawnie wdrożone metody interfejsu nie można nazwać na zmiennych instancji:
MyEnumerable<int> test = new MyEnumerable<int>();
var enumerator = test.GetEnumerator(); // will always call the generic method.
Jeśli chcesz dzwonić non metoda -generic, trzeba by rzucić test
do IEnumerable
:
((IEnumerable)test).GetEnumerator(); // calls the non-generic method
To również wydaje się być przyczyną braku modyfikatorów dostępu (takich jak public
lub private
) dla jawnych implementacji: i tak nie jest to widoczne na typie.
Na pewno jest tak, że można rozróżnić w przypadku, gdy klasa implementująca ma metodę z tym samym podpisem. – Tobias
Jawne implementacje interfejsu nie pozwalają używać modyfikatorów widoczności. Jestem pewien, że po prostu wpisałeś to źle w swoim pytaniu, więc kontynuuj i edytuj to. Jeśli uważasz, że się mylę, jeśli myślisz, że "publiczność" naprawdę istnieje, nie krępuj się, ale to, czego nie mogłeś skompilować. – hvd