Когда метод имеет параметр ref, тип аргумента должен точно соответствовать типу параметра. Предположим, что MethodName
были реализованы следующим образом:
public void MethodName(ref object x)
{
x = new object();
}
Что бы ожидать, если бы вы были в состоянии назвать его просто ref c
? Он пытался бы написать ссылку на равнину System.Object
на переменную типа System.String
, тем самым нарушая безопасность.
Итак, у вас должна быть переменная типа object
. Вы можете сделать это, как показано в ответе klausbyskov, но имейте в виду, что значение не будет, а затем будет скопировано обратно к исходной переменной. Вы можете сделать это с броском, но имейте в виду, что это может произойти сбой:
string c = "690";
object o = c;
MethodName(ref o);
// This will fail if `MethodName` has set the parameter value to a non-null
// non-string reference
c = (string) o;
Вот соответствующий бит спецификации C# 3.0, раздел 10.6.1.2 (курсив мой):
Когда формальный параметр является параметром опорного , соответствующий аргумент в вызове метода должен состоять из реф ключевых слова, за которым следует переменной-ссылка (§5.3.3) из же типа, что и формальный параметр. A переменная обязательно должна быть назначена , прежде чем она может быть передана как ссылка параметр.
Это дубликат http://stackoverflow.com/questions/1207144/c-why-doesnt-ref-and-out-support-polymorphism/1207302#1207302 –