Хорошо, я вырезаю и вставляю из отражателя .NET, чтобы продемонстрировать, что я пытаюсь сделать:
public override void UpdateUser(MembershipUser user)
{
//A bunch of irrelevant code...
SecUtility.CheckParameter(ref user.UserName, true, true, true, 0x100, "UserName");
//More irrelevant code...
}
Эта строка кода выводится из System.Web.Security.SqlMembershipProvider.UpdateUser(System.Web.dll v2.0.50727) в .NET Framework.
Для параметра SecUtility.CheckParameter требуется ссылочное значение в качестве первого параметра, которому передается свойство пользователя, переданного в качестве аргумента.
Определение кода CheckParameter:
internal static void CheckParameter(ref string param, bool checkForNull, bool checkIfEmpty, bool checkForCommas, int maxSize, string paramName)
{
//Code omitted for brevity
}
Все, что он делает, имеет смысл - на бумаге... поэтому я нокаутирую маленький маленький прототип, где-то я хотел бы использовать что-то подобное:
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.
}
}
Этот код не будет компилироваться - ошибка отображается как:
"A property or indexer may not be passed as an out or ref parameter"
Достаточно честный... но почему мой код не позволит мне делать что-то, что похоже на базу кода .NET Framework? Это ошибка с тем, как .NET Reflector интерпретирует DLL или это ошибка с тем, как я интерпретирую их код?