UPDAT E: La caratteristica desiderata è ora supportato in C# 7.
Il sistema di tipo CLR supporta metodi di Ref-ritorno, e ho scritto un prototipo sperimentale del compilatore C# che supporta la funzione che si desidera. (Il prototipo implementa anche variabili locali ref-typed, ma i campi ref-typed sono illegali nel sistema di tipo CLR.)
Hai raggiunto esattamente la sintassi che ho scelto per il prototipo, il che significa che entrambe le menti pensano allo stesso modo o che gli sciocchi non differiscono mai.
Anche se il prototipo funziona abbastanza bene, è molto improbabile che questo renderà la barra di diventare una caratteristica della prossima versione del linguaggio C#. Pochissimi clienti vogliono questa funzionalità, è abbastanza costoso da implementare, abbiamo una lista fino a quando il braccio di caratteristiche più importanti, e ci sono altri modi per fare questo tipo di lavoro cosa senza l'aggiunta di questa complessità al sistema tipo. Questi sono tutti dei "punti contro" che fanno la funzione.
Per esempio, si potrebbe fare un paio di delegati:
struct Ref<T>
{
private readonly Func<T> getter;
private readonly Action<T> setter;
public Ref(Func<T> getter, Action<T> setter)
{
this.getter = getter;
this.setter = setter;
}
public T Value { get { return getter(); } set { setter(value); } }
}
var arr = new int[10];
var myref = new Ref<int>(()=>arr[1], x=>arr[1]=x);
myref.Value = 10;
Console.WriteLine(myref.Value);
Questo è notevolmente più lento rispetto alla stessa funzione implementata con rendimenti ref, ma il vantaggio è che si può fare un Ref<T>
in luoghi dove ref è non legale. Ad esempio, è possibile memorizzare Ref<T>
in un campo, che non è possibile eseguire con un metodo di restituzione.
Se si dispone di uno scenario interessante davvero impressionante per questo che bisogno metodi ref-ritorno, avrei amore sentirne parlare. Più scenari del mondo reale abbiamo, più è probabile che tale funzionalità possa essere implementata in un'ipotetica versione futura della lingua.
vedere anche domande relative:
Can I use a reference inside a C# function like C++?
Why doesn't C# support the return of references?
e il mio blog post sull'argomento:
http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/
vuoi assegnare l'elemento alla matrice o ottenere il suo valore? Vuoi una funzione che legge qualcosa o scrive qualcosa? – Axarydax
Voglio assegnare un valore nella funzione chiamante .. – Betamoo
Non solo non puoi fare questo, si sta cercando di restituire un riferimento a un'istanza di un tipo di valore. Non so nemmeno cosa significherebbe. –