Bueno, voy a cortar y pegar desde el reflector .NET para demostrar lo que estoy tratando de hacer:¿Por qué no puedo pasar una propiedad o indizador como un parámetro ref cuando el reflector .NET muestra que está hecho en .NET Framework?
public override void UpdateUser(MembershipUser user)
{
//A bunch of irrelevant code...
SecUtility.CheckParameter(ref user.UserName, true, true, true, 0x100, "UserName");
//More irrelevant code...
}
Esta línea de código viene directamente de System.Web.Security.SqlMembershipProvider.UpdateUser (Sistema. Web.dll v2.0.50727) en .NET Framework.
El SecUtility.CheckParameter requiere un valor de referencia como primer parámetro, al que pasan una propiedad del usuario pasado como argumento.
La definición del código CheckParameter es:
internal static void CheckParameter(ref string param, bool checkForNull, bool checkIfEmpty, bool checkForCommas, int maxSize, string paramName)
{
//Code omitted for brevity
}
Todo lo que está haciendo tiene sentido - en el papel ... así que llamo un poco de prototipo rápido para un lugar que me gustaría usar algo similar:
public class DummyClass
{
public string ClassName{ get; set; }
}
public class Program
{
private static DoSomething(ref string value)
{
//Do something with the value passed in
}
public static Main(string[] args)
{
DummyClass x = new DummyClass() { ClassName = "Hello World" };
DoSomething(ref x.ClassName); //This line has a red squiggly underline
//under x.ClassName indicating the
//error provided below.
}
}
Este código no se compilará - muestra el error como:
"A property or indexer may not be passed as an out or ref parameter"
Bastante ... pero ¿por qué mi código no me permite hacer algo que parece estar en la base de código de .NET Framework? ¿Es esto un error con la forma en que .NET Reflector está interpretando la DLL o es un error con la forma en que estoy interpretando su código?
Usted está utilizando una propiedad automática. Cuando se compila, se convierte en dos funciones. Entonces el marco no puede pasar una referencia a dos funciones a otra cosa. –
@Yuriy - eso sería comprensible. Sin embargo, en el código que me hizo notar este problema, estoy usando la clase * same * MembershipUser mencionada en el Framework * exactamente de la misma manera *: ¿cómo es posible que se pueda hacer dentro del framework pero no fuera? – BenAlabaster
Dónde está @JonSkeet cuando lo necesitas ... – BenAlabaster