2016-07-31 3 views
0

Я написал простую программу, используя ключевое слово params, чтобы взять параметры и записать их на консоль. Что я хочу/ожидаю, и что произойдет C# documentation states, когда я передаю один массив параметру с тегом params, так это то, что массив станет первым элементом массива params. Вот некоторые примеры кода:params ключевое слово принимает массив как один параметр интерпретирует содержимое массива как все его параметры

public static void Main() 
    { 
     Paramtest(new object[] { "hi", "wow", 78 }); 
     Console.ReadKey(); 
    } 

    public static void Paramtest(params object[] args) { 
     foreach (object o in args) { 
      Console.WriteLine("{0} is a type of {1}.", o.ToString(), o.GetType()); 
     } 
    } 

Что я должен см это одна строка письма на консоли, которая гласит:

System.object[] is a type of System.object[]. 

Что делать вижу, это три линии письма:

hi is a type of System.String. 
wow is a type of System.String. 
78 is a type of System.Int32. 

Я обнаружил, что вызывает Paramtest с другим параметром после массив, например: Paramtest(new object[] { "hi", "wow", 78 }, String.Empty);, дает ожидаемые результаты (плюс пустая строка), так что это может быть один из способов обойти эту проблему, однако в моем случае это не изящно и не очень хорошо. Из того, что говорится в документации, этого не должно происходить. Есть ли элегантный обходной путь для решения этой проблемы?

+1

Возможный дубликат [C# Params очевидно ошибка компилятора (C# 5.0)] (http://stackoverflow.com/questions/9709642/c-sharp-params -apparent-compiler-bug-c-5-0) –

+0

Да, я думаю, это :( К сожалению, я не видел этого сообщения, когда делал свое исследование, прежде чем публиковать свой вопрос. –

ответ

1

Вы можете привести аргумент к object:

public static void Main() 
{ 
    Paramtest((object)new object[] { "hi", "wow", 78 }); 
    Console.ReadKey(); 
} 
1

Я согласен, что пример кода вы указали в документации, может привести к немного путаницы. Здесь вы используете Объектный массив, тогда как в примере используется массив Integer, который обрабатывается по-разному.

Посмотрите на этот ответ, чтобы понять, что происходит: C# params object[] strange behavior