Хорошо, я буду вырезать и вставлять из .NET отражателем, чтобы продемонстрировать то, что я пытаюсь сделать:Почему я не могу передать свойство или индексатор в качестве параметра ref, когда отражатель .NET показывает, что это сделано в .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...
}
Эта строка кода приходит прямо из 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 или это ошибка с тем, как я интерпретирую их код?
Вы используете автоматическую собственность. Когда он компилируется, он превращается в две функции. Таким образом, структура не может передать ссылку на две функции во что-то другое. –
@Yuriy - это было бы понятно. Однако в коде, который заставил меня заметить эту проблему, я использую * тот же класс MembershipUser, на который ссылается в Framework * точно так же *, - почему это можно сделать внутри рамки, но не снаружи? – BenAlabaster
Где @JonSkeet, когда он вам нужен ... – BenAlabaster