Хорошо, я буду вырезать и вставлять из рефлектора .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, или это ошибка в том, как я интерпретирую их код?