Hier ist ein vereinfachtes Beispiel, wie ich meinen Code arbeiten möchte. Bitte beachten Sie, dass dieser Code nicht kompiliert:C# Inkonsistente Zugänglichkeit Verhindert private Klassen als Parameter für geschützte Methoden
protected void doStuff(UtilityObject utilityObject)
Uneinheitliche Zugänglichkeit:
namespace SpecificNamespace { class UtilityObject { //properties } public abstract class Entity { protected void doStuff(UtilityObject utilityObject) { //does stuff } } // include implementations of Entity } namespace GeneralNamespace { public static class World { public static List<SpecificNamespace.Entity> Entities = new List<SpecificNamespace.Entity>(); } }
Es ist nicht wegen der Zeile nicht kompiliert Parametertyp ‚UtilityObject‘ ist weniger zugänglich als Methode ‚Entity .doStuff (UtilityObject utilityObject)‘
Aber ich schwöre, ich wollte nur Entity
für Klassen implementieren, die innerhalb vondeklariert werdenund daher hätte jede Klasse, die auf die geschützte Methode Entity.Dostuff
verweist, auch Zugriff auf UtillityObject
. Da keine Klasse außerhalb dieses Namespace irgendwas weiß, was ein UtilityObject
ist, möchte ich es nicht als öffentlich deklarieren. Auf der anderen Seite muss Entity
öffentlich sein, so dass die Entitäten generisch bezeichnet werden können.
Gibt es einen Weg um dies? Ist das ein Mangel an C# -Konventionen? Bin ich damit gerade zu wertvoll?
Randbemerkung: Ich bin ziemlich sicher, dass Sie falsche Vorstellung von Namensräumen haben - Namespaces in C# bedeuten absolut nichts zur Sichtbarkeit. Sie sind nur ein Teil des Typs name. Sie können alle Ihre Klassen im 'System'-Namespace deklarieren - aber dadurch werden ihnen keine magischen Kräfte verliehen. –
Eine Klasse öffentlich zu machen, macht sie also nicht außerhalb ihres Namensraums sichtbar? –
Wenn Sie es nur in Ihrer eigenen Assembly aufrufen, können Sie 'doStuff' intern anstatt geschützt machen. Das würde den Fehler beheben. –