2016-12-09 3 views
0

У меня есть 2 подпрограммы, которые делают так, что они спрашивают двух разных игроков для имени, но когда я вызываю его в основном, он говорит, что аргумент1 должен быть передан с ключевое слово 'ref', но я не делаю этого уже?Моя подпрограмма не потребует значений, которые мне нужны

static string GetPlayer1(ref string name1) 
{ 
    Console.WriteLine("PlayerX enter your name:"); 
    name1 = Console.ReadLine(); 
    return name1; 
} 

static string GetPlayer2(ref string name2) 
{ 
    Console.WriteLine("PlayerO enter your name:"); 
    name2 = Console.ReadLine(); 
    return name2; 
} 

static void Main(string[] args) 
{ 
    string name1 = GetPlayer1(name1); 
    string name2 = GetPlayer2(name2); 
... 
+0

Почему вы думаете, что вам нужно передать параметры этих методов вообще? –

+0

Вы проголосовали за обоих исправлений, предоставленных вам? –

+0

@SimonPrice: Он не потому, что не может. – Sefe

ответ

0

На самом деле, вы не делаете что:

string name1 = GetPlayer1(ref name1); 
    string name2 = GetPlayer2(ref name2); 

То, что вы сделали, чтобы добавить реф ключевое слово в определении метода (создание реф параметра). Вы должны использовать его также в вызове метода (создавая реф. аргумент).

В вашем текущем случае, хотя нет необходимости передавать аргументы по ссылке. Вы устанавливаете их с возвращаемым значением вашего метода GetName.

0

Если вы определяете метод с реф параметра, вам нужно вызвать этот метод с параметром в качестве ссылки:

static void Main(string[] args) 
{ 
    string name1 = GetPlayer1(ref name1); 
    string name2 = GetPlayer2(ref name2); 
} 

И только для полноты картины, как и другие ответы уже сказать вам: Я не вижу необходимости в ссылке здесь, вы можете достичь своих целей без него.

4

Здесь ref в параметрах метода не используется, на самом деле вам даже не нужны параметры. Измените его следующим образом:

static string GetPlayer1() 
{ 
    Console.WriteLine("PlayerX enter your name:"); 
    return Console.ReadLine(); 
} 

static string GetPlayer2() 
{ 
    Console.WriteLine("PlayerO enter your name:"); 
    return Console.ReadLine(); 
} 

static void Main(string[] args) 
{ 
    string name1 = GetPlayer1(); 
    string name2 = GetPlayer2(); 
} 


Однако если это был ваш намерение использовать ref (в качестве примера или упражнения), то это будет, как это сделать. Теперь у методов нет типа возврата (void вместо string), потому что тексты возвращаются посредством назначения параметрам ref.

static void GetPlayer1(ref string name1) 
{ 
    Console.WriteLine("PlayerX enter your name:"); 
    name1 = Console.ReadLine(); 
} 

static void GetPlayer2(ref string name2) 
{ 
    Console.WriteLine("PlayerO enter your name:"); 
    name2 = Console.ReadLine(); 
} 

static void Main(string[] args) 
{ 
    string name1; 
    string name2; 
    GetPlayer1(ref name1); // "ref" must now be specified, simply because 
    GetPlayer2(ref name2); // both methods also specify it. 
} 


Более о ref (например, когда и как использовать его), чтобы эти вопросы:
- Example of practical of "ref" use
- Why use the 'ref' keyword when passing an object?