Using an array as argument for string.Format()

后端 未结 4 1774
甜味超标
甜味超标 2021-01-07 19:13

When trying to use an array as an argument for the string.Format() method, I get the following error:

FormatException: Index (zero based)

相关标签:
4条回答
  • 2021-01-07 19:37

    As others have already said, you can't convert int[] to object[]. But you can fix this issue using Enumerable.Cast<T>():

    infoText.text = string.Format
    (
          "Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}",                        
          place.Cast<object>().ToArray()
    );
    

    BTW, if you're on C# 6 or above, you might consider using interpolated strings instead of string.Format:

    infoText.text = $"Player1: {place[0]}\n Player 2: {place[1]} \n Player 3: {place[2]} \n Player 4: {place[3]}";
    
    0 讨论(0)
  • 2021-01-07 19:38

    It is possible to pass an explicit array for a params argument, but it has to have the matching type. string.Format has a few overloads, of which the following two are interesting to us:

    string.Format(string, params object[])
    string.Format(string, object)
    

    In your case treating the int[] as object is the only conversion that works, since an int[] cannot be implicitly (or explicitly) converted to object[], so string.Format sees four placeholders, but only a single argument. You'd have to declare your array of the correct type

    var place = new object[] {1,2,3,4};
    
    0 讨论(0)
  • 2021-01-07 19:46

    Quick fix.

    var place = new object[] { 1, 2, 3, 4 };
    

    C# does not support co-variant array conversion from int[] to object[] therefor whole array is considered as object, hence this overload with a single parameter is called.

    0 讨论(0)
  • 2021-01-07 20:01

    You can convert int array to string array as pass it using System.Linq Select() extension method.

    infoText.text = string.Format("Player1: {0} \nPlayer2: {1} \nPlayer3: {2} \nPlayer4: {3}", 
                                  place.Select(x => x.ToString()).ToArray());
    

    Edit:

    In C# 6 and above, you can also able to use String Interpolation instead of using string.Format()

    infoText.text = $"Player1: {place[0]}\nPlayer2: {place[1]} \nPlayer3: {place[2]} \nPlayer4: {place[3]}";
    

    Check this fiddle for your reference.

    0 讨论(0)
提交回复
热议问题