- C'è un modo per marcare un tipo (o, meglio ancora, un'interfaccia) in modo che nessuna istanza di esso possono essere memorizzati in un campo (in modo simile a
TypedReference
eArgIterator
)? - Allo stesso modo, c'è un modo per impedire che le istanze vengano passate attraverso metodi anonimi e - In generale - Per simulare il comportamento dei due tipi sopra?
- Questo può essere fatto tramite ILDasm o, più in generale, attraverso l'editing di IL? Dal momento che UnconstrainedMelody ottiene risultati normalmente non ottenibili attraverso la modifica binaria di un assembly compilato, forse esiste un modo per "contrassegnare" determinati tipi (o anche meglio, quelli astratti o interfacce marker) attraverso lo stesso approccio.
dubito che hardcoded nel compilatore perché i documentation for the error CS0610 stati:di digitare make non memorizzabili
Ci sono alcuni tipi che non possono essere utilizzati come campi o proprietà. Questi tipi includono ...
Che a mio avviso suggerisce che l'insieme di tipi come quelli può essere esteso - Ma potrei sbagliarmi.
Ho cercato un po 'su SO e anche se ho capito che non è possibile eseguire throwing a compiler error a livello di codice, non ho trovato alcuna fonte che affermasse che determinati comportamenti di tipi "speciali" non potevano essere replicati.
Anche se la domanda è per lo più accademica, potrebbero esserci alcuni usi per una risposta. Ad esempio, a volte può essere utile assicurarsi che la vita di un certo oggetto sia vincolata al blocco del metodo che la crea.
MODIFICA:RuntimeArgumentHandle
è un altro (non menzionato) tipo non memorizzabile.
EDIT 2: Se può essere di qualche utilità, sembra che il CLR tratta tali tipi in modo diverso e, se non solo il compilatore (ancora assumendo che i tipi sono in alcun modo diverso dagli altri). Il seguente programma, ad esempio, genererà uno TypeLoadException
relativo a TypedReference*
. L'ho adattato per renderlo più breve ma puoi aggirare tutto ciò che desideri. La modifica del tipo di puntatore, ad esempio, void*
non genera l'eccezione.
using System;
unsafe static class Program
{
static TypedReference* _tr;
static void Main(string[] args)
{
_tr = (TypedReference*) IntPtr.Zero;
}
}
Non sarei affatto sorpreso se * fosse * hardcoded, btw. Solo perché la documentazione non vuole ridurla non vuol dire che non sia così nel compilatore. –
Penso la stessa cosa, ma dovrò controllare. –
[CS0611] (http://msdn.microsoft.com/en-US/library/bfca7x6z (v = vs80) .aspx) è un errore correlato, anche se probabilmente la soluzione per entrambi si applicherebbe a entrambi. – Mir