updat E: La característica deseada es ahora compatible con C# 7.
El sistema de tipos de CLR no apoyar métodos REF-volver, y he escrito un prototipo experimental del compilador de C#, que es compatible con la función que desea. (El prototipo también implementa variables locales ref-tipadas, pero los campos ref-typed son ilegales en el sistema de tipo CLR.)
Ha accedido exactamente a la sintaxis que elegí para el prototipo, lo que significa que las grandes mentes piensan igual , o que los tontos nunca difieren.
Aunque el prototipo funciona muy bien, es muy poco probable que esto haga que la barra se convierta en una característica de la próxima versión del lenguaje C#. Muy pocos clientes quieren esta característica, es bastante costosa de implementar, tenemos una lista siempre y cuando su brazo de características más importantes, y hay otras maneras de hacer que este tipo de cosas funcionen sin agregar esta complejidad al sistema de tipos. Estos son todos grandes "puntos en contra" de hacer la función.
Por ejemplo, usted podría hacer un par de delegados:
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);
Eso es considerablemente más lento que la misma característica implementada con rendimientos árbitro, pero la ventaja es que se puede hacer una Ref<T>
en lugares donde ref es ilegal. Por ejemplo, puede almacenar Ref<T>
en un campo, que no puede hacer con un método de devolución de referencia.
Si usted tiene un escenario realmente impresionante convincente de por qué se necesita métodos REF-volver, me amor oír hablar de eso. Cuantos más escenarios del mundo real tengamos, más probable es que dicha característica se implemente en una versión futura hipotética del idioma.
Ver preguntas También relacionado:
Can I use a reference inside a C# function like C++?
Why doesn't C# support the return of references?
y mi blog sobre el tema:
http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/
qué quiere asignar el elemento a la matriz o obtener su valor? ¿Desea una función que lea algo o escriba algo? – Axarydax
Quiero asignar un valor en la función de llamada .. – Betamoo
No solo no puede hacer esto, está tratando de devolver una referencia a una instancia de un tipo de valor. Ni siquiera sé qué significaría eso. –