2015-12-14 7 views
5

wird das folgende erste Beispiel Lassen Sie betrachten:C# Compiler-Fehler Unterschiede zwischen CS0122 und CS0143

public class ClassNameExample 
{ 
    private ClassNameExample() 
    { 
     //code goes here  
    } 
} 

Nun, wenn ich versuche, die ClassNameExample Klasse zu instanziiert innerhalb derselben Baugruppe, werde ich eine „unzugängliche bekommen aufgrund Es ist Compiler Fehlermeldung "Protection Level" (CS0122).

Allerdings, wenn ich versuchen, die ClassNameExample Klasse von einer anderen Baugruppe zu instanziiert, ich bin eine immer Compiler-Fehlermeldung „Der Typ‚Klasse‘keine Konstruktoren definiert hat“ (CS0143)

Kann jemand erklären, warum die Compiler sieht sie anders?

Als Referenz habe ich dies in Visual Studio 2012, .NET 4.5 versucht.

+5

In meiner ehrlichen Meinung, wenn Sie in der gleichen Assembly Compiler weiß über die Existenz des privaten Konstruktors, so sagt es Ihnen, dass es privat ist. Wenn Sie in einer anderen Assembly sind, weiß es einfach nicht, es weiß nur, dass die Klasse keinen öffentlichen Konstruktor freigibt –

+0

Meine Vermutung wäre, weil der Compiler beim Kompilieren der gleichen Assembly die Konstruktordefinition sieht, aber sie ist privat und daher nicht zugänglich. Beim Kompilieren einer anderen Assembly sieht der Compiler nur die veröffentlichte Schnittstelle für diese Assembly, ohne selbst auf die Interna zugreifen zu müssen. In dieser öffentlichen Schnittstelle gibt es keinen Konstruktor, so weit es den Compiler betrifft, gibt es keinen Konstruktor. Ich kann jedoch keine zuverlässige Quelle nennen, daher freue ich mich, jemanden als Antwort zu sehen. – CompuChip

Antwort

1

Ich habe versucht zu sehen, was Microsoft.CSharp.CSharpCodeGenerator tut und herauszufinden, wo die Fehler aufgefüllt sind, aber der Code am Ende beruht auf externen Dateien.

Die einzige Antwort, die ich Ihnen geben kann, ist: wenn Sie eine Instanz mit

Assembly.GetExecutingAssembly().CreateInstance("ClassNameExample"); 

erstellen oder sogar mit Activator.CreateInstance("Your assembly", "ClassNameExample");

beide null zurück, weil sie auf öffentlichen Konstruktor verlassen, überprüfen Sie die Flaggen

public object CreateInstance(string typeName) 
    { 
     return this.CreateInstance(typeName, false, BindingFlags.Instance | BindingFlags.Public, (Binder) null, (object[]) null, (CultureInfo) null, (object[]) null); 
    } 

    Activator.CreateInstance(assemblyName, typeName, false, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance, (Binder) null, (object[]) null, (CultureInfo) null, (object[]) null, (Evidence) null, ref stackMark); 
Verwandte Themen