2009-07-22 4 views
3

Also was bedeutet das und wie repariere ich es?Sub Neu() ist in diesem Kontext nicht zugänglich, weil es "Freund" ist

Diese Meldung wird angezeigt, wenn ich das Schlüsselwort New in die Zeile (n) unten setze. Wenn ich es entferne, erhalte ich zur Laufzeit einen Fehler, der besagt, dass ich New benutzen muss. Was mache ich falsch?

Dim oPS As AeccPointStyle = New AeccPointStyle 
ops = oDescKey.PointStyle 

Debug.Print(oPS.Name) 
Debug.Print(oPS.MarkerSymbolName) 

versuchte auch

Dim oPS As New AeccPointStyle 
ops = oDescKey.PointStyle 

Debug.Print(oPS.Name) 
Debug.Print(oPS.MarkerSymbolName) 

Dank!

Update 1 - basierend auf Kommentar von Meta-Knight

1 -

Dim oPS As AeccPointStyle = Nothing 
oPS = oDescKey.PointStyle 

2 -

Dim oPS As AeccPointStyle = oDescKey.PointStyle 

Beide Versionen NullReferenceExceptions werfen.

+1

Ist oDescKey initialisiert oder 'Nothing'? –

Antwort

4

Der leere Konstruktor von AeccPointStyle ist als Freund markiert, was bedeutet, dass nur Klassen innerhalb seiner Assembly ihn aufrufen können.

Aber schauen Sie auf Ihren Code, ich glaube nicht, dass Sie New anrufen müssen. Setze es zuerst auf Nichts. Oder noch besser, setzen Sie direkt Ihre Variable mit dem guten Wert:

Dim oPS As AeccPointStyle = oDescKey.PointStyle 

bearbeiten über Ihre Nullreferenceexception:

Typischerweise wird diese Art von Ausnahme wird ausgelöst, wenn Sie eine Eigenschaft eines Objekts aufrufen mit einem Wert von Nichts. Wenn in diesem Fall oDescKey auf Nothing gesetzt ist, würde eine solche Ausnahme ausgelöst werden.

Wenn oDescKey NICHT den Wert Nothing hat, dann ist die einzige Eigenschaft, die Code ausführt, die PointStyle-Eigenschaft. Daher kann davon ausgegangen werden, dass die PointStyle-Eigenschaft eine NullReferenceException auslöst. Versuchen Sie, die Variable oDescKey.PointStyle im Debugger zu beobachten. Sie sollten sehen, dass eine Ausnahme ausgelöst wird.

+0

Ich denke, dass Sie die Schlüsselwörter "Friend" und "Protected" vermischen. –

+0

@Fredrik: Ups, du hast Recht, wird bearbeiten –

+0

oDescKey ist nicht null. Ich setze eine Uhr und jetzt bin ich debug.printing die Name-Eigenschaft von oDescKey unmittelbar vor der Zeile, die die NullException wirft. – DenaliHardtail

0

Meine Vermutung ist folgende: AeccPointStyle wird in einer anderen Assembly deklariert als das Codebeispiel in Ihrer Frage. Der Konstruktor (Sub New) von AeccPointStyle wird als Friend deklariert, was bedeutet, dass er nur innerhalb derselben Baugruppe erreichbar ist.

Sie können dies auf zwei Arten lösen

  • ändern Sub New so dass es Public ist
  • ein Shared Public Sub Create Geben Sie, dass eine neue AeccPointStyle
+0

Ja, AeccPointStyle befindet sich in einer anderen Assembly. Ich glaube, es ist eine COM-Komponente für den .NET-Verbrauch verpackt. Ich kann die Quelle nicht ändern, da dieser Typ über die API eines Produkts verfügbar ist. – DenaliHardtail

0

AeccPointStyle haben nicht schaffen wird und zurück ein öffentlicher Standardkonstruktor. Der, den Sie verwenden möchten, ist auf andere Klassen innerhalb derselben Assembly beschränkt.

Hier einige Code, den ich online gefunden:

Dim oPointStyle As AeccPointStyle 
Set oPointStyle = g_oAeccDoc.PointStyles.Add(strName) 

Beachten Sie die PointStyles Eigenschaft (wahrscheinlich eine Art von PointStylesColleciton) auf g_oAeccDoc ist Instanziieren und eine neue AeccPointStyle Instanz für Sie zurück.

Friend Class AeccPointStyle 

oder der Standard-Konstruktor hat den Modifikator 'Freund', dh:

2

Wenn Ihr AeccPointStyle Klasse einen 'Freund' Modifikator, dh es wird mit wird definiert als

Friend Sub New() 

und der von Ihnen gepostete Code befindet sich nicht in derselben Assembly. Sie können den Konstruktor für diese Klasse nicht aufrufen. Damit dies funktioniert, müssen Sie Ihren Code in derselben Assembly wie die AeccPointStyle-Klasse speichern. Sehen Sie sich diese Seite an, um mehr über die Modifikatoren zu erfahren: more information about modifiers

0

Wenn Sie FRIEND als Zugriffsmodifizierer für Ihre Klasse verwenden, müssen Sie sicherstellen, dass sich sowohl die Klasse it-self als auch die Klasse, in der Sie sie verwenden, im selben NAMESPACE befinden Andernfalls erhalten Sie diese Fehlermeldung.

Verwandte Themen