2010-02-19 2 views
4

Привет я должен вызвать метод, который имеет эту подпись:метод с параметром объекта исх

int MethodName(ref object vIndexKey) 

Если я пытаюсь вызвать его с

String c = "690"; 

MethodName(ref (object) c); 

Это не работает.

Как я могу это сделать?

благодаря

+0

Это дубликат http://stackoverflow.com/questions/1207144/c-why-doesnt-ref-and-out-support-polymorphism/1207302#1207302 –

ответ

10

Вы должны сделать это так:

String c = "690"; 
object o = (object) c; 
MethodName(ref o); 

Причина заключается в том, что параметр должен быть назначаемой функцией. Функция может сделать что-то вроде этого:

o = new List<int>(); 

Что не представляется возможным, если базовый типом является строкой, которая была отлита на объект во время вызова метода, так как цель задания по-прежнему будет строкой и а не объект.

-1

ли

MethodName(ref c); 

не работает?

+0

нет, это не работает –

+0

Нет , для параметров «ref» аргумент должен быть точно того же типа. –

+1

А, справедливо. Файл под «узнайте что-нибудь новое каждый день». –

2

Когда метод имеет параметр 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 переменная обязательно должна быть назначена , прежде чем она может быть передана как ссылка параметр.

Смежные вопросы