2015-04-13 15 views
7

Quando si tenta di utilizzare le costanti in questa applicazione C#. Quando eseguo tramite il debugger, le costanti vengono in su come un "identificatore sconosciuto" Heres il codiceIdentificatore sconosciuto quando si usano le costanti 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"; 
} 

Questa è la linea di codice in cui la sua non è la valutazione sembra

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

Così, quando ho passo attraverso il debugger e rompere su questa linea. Se tieni su una delle costanti. Dice solo "Identificatore sconosciuto ConstsConfig" o "Identificatore Unown NetworkConfig"

Immagino che sia qualcosa di piccolo. Grazie per l'aiuto in anticipo.

+1

Il debugger 'live eval' può essere .. difficile. Ad ogni modo, se non esiste un * errore di compilazione * o * un'eccezione *, allora il codice funziona, indipendentemente dalla "valutazione live". – user2864740

+0

La convenzione in C# è ** non ** per fornire i nomi maiuscoli delle costanti, anche se questi devono essere valori immutabili, quindi utilizzare 'public const String' o' public static readonly String'. – Dai

+0

Sembra un problema con il debugger. Mi consiglia di fare una ricostruzione pulita e/o riavviare VS. Il tuo debugger si aggancia al tuo codice in fase di runtime, può avere problemi a correlare l'IL alla tua sorgente, non significa che c'è qualcosa di sbagliato nella sorgente. – evanmcdonnal

risposta

9

C'è un problema di debug di vecchia data in Xamarin.Android con Visual Studio relativo all'ispezione dei valori nelle classi statiche. In particolare, se si imposta un punto di interruzione su una riga che fa riferimento a una classe statica (o una classe non statica con membri statici), Visual Studio potrebbe mostrare il valore dell'ispezione come "Identificatore sconosciuto: [ClassName]".

Dalla mia analisi, risulta che le posizioni dei file di classe nel progetto determinano o meno il problema.

Il risultato è che, finché Xamarin non risolve il bug, tutte le classi statiche e le classi con membri statici devono essere posizionate nella cartella principale del progetto. Ci sono altre opzioni per il posizionamento dei file, ma alcune non funzionano e una richiede la qualifica completa della chiamata di classe statica con lo spazio dei nomi, anche quando non è richiesta dal compilatore.

Vedere i commenti nel codice sotto per i dettagli completi.

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; 
//}  
} 

Su 2016/04/03, ho aggiornato il biglietto associato Xamarin Bugzilla con queste informazioni. Speriamo che si risolvano presto.

+1

Grazie per questo, è ora agosto e il bug persiste! – Sherlock

Problemi correlati