2015-04-13 15 views
7

Wenn ich versuche, Konstanten in dieser C# -Anwendung zu verwenden. Wenn ich über den Debugger laufen, kommen die Konstanten als „unknown identifier“ bis Heres den CodeUnbekannte Kennung bei Verwendung von Konstanten C#

public static class ConstsConfig 
{ 
    public static string BASE_URL_FORMAT = "%s://%s%s"; 
} 

public static class NetworkConfig 
{ 
    public static string PROTOCOL = "http"; 
    public static string HOST = "www.example.com"; 
    public static string BASE_URL = "/test"; 
} 

Code Das ist die Linie, wo seine Auswertung nicht wie

Uri uri = new Uri(String.Format(ConstsConfig.BASE_URL_FORMAT, NetworkConfig.PROTOCOL, NetworkConfig.HOST, NetworkConfig.BASE_URL))); 

wenn So scheint i Schritt durch den Debugger und brechen Sie diese Zeile. Wenn Sie über eine der Konstanten hoever. Es sagt nur „Unknown Kennung ConstsConfig“ oder „Uknown Kennung NetworkConfig“

Ich würde es ist etwas klein vorstellen. Danke für die Hilfe im Voraus.

+1

Der Debugger 'live eval' kann ... knifflig sein. Wie auch immer, wenn es keinen * Kompilierfehler * oder * Ausnahme * gibt, dann funktioniert der Code, unabhängig von der 'live eval'. – user2864740

+0

Konvention in C# ist ** nicht **, um Konstanten Großbuchstaben zu geben, auch wenn diese als unveränderliche Werte gemeint sind, dann verwenden Sie entweder 'public const String' oder 'public static readonly String'. – Dai

+0

Klingt wie ein Problem mit dem Debugger. Ich würde empfehlen, nur einen sauberen Rebuild durchzuführen und/oder VS neu zu starten. Ihr Debugger hängt zur Laufzeit in Ihren Code ein, er kann Probleme haben, die IL mit Ihrer Quelle zu korrelieren, es bedeutet nicht, dass mit der Quelle etwas nicht in Ordnung ist. – evanmcdonnal

Antwort

9

Es gibt eine langjährige Debug-Ausgabe in Xamarin.Android mit Visual Studio in Bezug auf Werte in statischen Klassen Inspektion. Wenn Sie einen Haltepunkt in einer Zeile festlegen, die auf eine statische Klasse (oder eine nicht statische Klasse mit statischen Elementen) verweist, zeigt Visual Studio den Prüfwert möglicherweise als "Unbekannter Bezeichner: [ClassName]" an.

Aus meiner Analyse, es stellt sich heraus, dass die Standorte von Klassendateien in dem Projekt entscheiden, ob Sie dieses Problem haben werden.

Das Fazit für mich ist, dass, bis Xamarin den Fehler behebt, alle statischen Klassen und Klassen mit statischen Elementen im Stammordner des Projekts platziert werden sollten. Es gibt andere Optionen für die Dateiplatzierung, aber einige Flat-Outs funktionieren nicht, und einer erfordert die vollständige Qualifizierung Ihres statischen Klassenaufrufs mit dem Namespace - auch wenn dies vom Compiler nicht benötigt wird.

Siehe Kommentare im Code unten für weitere Informationen.

MainActivity.cs

using System; 
using Android.App; 
using Android.OS; 

namespace App1 { 

[Activity(Label = "Unknown Identifier Test", MainLauncher = true)] 
public class MainActivity : Activity {   

    protected override void OnCreate(Bundle bundle) { 
     base.OnCreate(bundle); 

     Console.WriteLine(MyClass.MyString);   // Unqualified 
     Console.WriteLine(App1.MyClass.MyString);  // Fully Qualified with namespace 

     /* 
     Set a break point on the "Console.WriteLine()" lines above and you'll get the 
     "Unknown identifier: MyClass" error when trying to inspect under specific conditions... 

     File Locations          Unqualified    Fully Qualified 
     ------------------------------------------------- --------------------- -------------------- 
     MainActivity.cs in root, MyClass.cs in sub-folder "Unknown identifier" Inspection Works 
     MainActivity.cs in sub-folder, MyClass.cs in root Inspection Works  Inspection Works 
     Both in root          Inspection Works  Inspection Works 
     Both in different sub-folders      "Unknown identifier" "Unknown identifier" 
     Both in same sub-folder        "Unknown identifier" "Unknown identifier" 
     */ 
    } 
} 
} 

MyClass.cs

namespace App1 { 
public static class MyClass { 
    public static string MyString; 
} 

// The class can also be constructed this way, which results in the same findings: 
//public class MyClass { 
// public static string MyString; 
//}  
} 

Am 2016.04.03, ich habe das damit verbundene Xamarin Bugzilla-Ticket mit diesen Informationen aktualisiert. Hoffentlich bekommen sie das bald gelöst.

+1

Danke dafür, es ist jetzt August und Bug bleibt bestehen! – Sherlock

Verwandte Themen