Richter nel suo libro (p. 444) dice:
"Il compilatore JIT (Just-In-Time) esamina l'attributo personalizzato System.Diagnostics.DebuggableAttribute applicato all'assembly. In genere, il compilatore applica questo attributo automaticamente. Se nell'attributo è specificato true per il parametro isJITOptimizerDisabled del costruttore DebuggableAttribute, il compilatore JIT non eseguirà l'inlining dei metodi dell'assembly. Per impostare questo parametro su true è possibile utilizzare l'opzione /debug del compilatore C#."
E' un po' strano secondo me il fatto che isJITOptimizerDisabled sia collegato all'opzione /debug (che sta nella categoria Debugging/Error Checking e ha il significato di Emit Debugging Information) e non all'opzione /optimize (della categoria Optimizations e che ha il significato Enable/Disable Optimizations). Secondo voi Richter si è sbagliato e in realtà si riferiva al parametro isJITTrackingEnabled? Ma se anche fosse così, ho fatto tutte le combinazioni tra, da una parte isJITTrackingEnabled (true/false), isJITOptimizerDisabled (true/false) nel codice come:
[assembly:System.Diagnostics.Debuggable(..., ...)]
(sufficiente un programma che contenga solo questa riga dove al posto dei puntini mettete varie combinazioni di true o false) e dall'altra parte /debug (+/-) e /optimize (+/-) nelle opzioni del compilatore C# con varie combinazioni di "+" o "-". Mi è risultata una matrice stranissima da cui non vedo alcuna regola per evitare l'errore CS0647 con la reason: "Assembly custom attribute 'System.Diagnostics.DebuggableAttribute' was specified multiple times with different values".
La mia domanda è: che relazione c'è tra l'attributo DebuggableAttribute, le opzioni del compilatore C# e l'errore CS0647?