Это продолжение thread Я думал, что вчера было решено. Вчера у меня были проблемы с моим кодом в следующем случае:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
class Bar
{
int v;
public Bar(int v) { this.v = v; }
public override string ToString() { return v.ToString(); }
}
static void Main(string[] args)
{
Foo(1, 2, 3);
Foo(new int[] { 1, 2, 3 });
Foo(new Bar(1), new Bar(2), new Bar(3));
Foo(new Bar[] { new Bar(1), new Bar(2), new Bar(3) });
System.Threading.Thread.Sleep(20000);
}
static void Foo(params object[] objs)
{
Console.WriteLine("New call to Foo: ");
foreach(object o in objs)
Console.WriteLine("Type = " + o.GetType() + ", value = "+o.ToString());
}
}
}
Если вы запустите это, вы можете увидеть проблему с последним вызовом Foo. То, что аргумент является вектором, «потеряно».
Итак .... кто-нибудь знает, как сообщить об ошибке компилятора C #? Или это будет считаться ошибкой отражения?
(Какое облегчение: я был обескуражен, подумав, что зря потратил здесь время на собственную ошибку. На самом деле, это все-таки ошибка C #, и я оправдан! И как часто мы можем видеть настоящие ошибки компилятора C # в наши дни? Нечасто ...)
new Foobar(3))
, не так ли? - person Tim Schmelter   schedule 15.03.2012{}
, чтобы сделать это с большим блоком текста. - person phoog   schedule 15.03.2012object
, как вFoo((object)new Bar[] { new Bar(1), new Bar(2), new Bar(3) });
. Насколько мне известно, всегда можно устранить неоднозначность между нормальной формой и расширенной формой методаparams
с помощью простого приведения, поэтому никогда не требуется явно создавать самый внешний массив. - person Jeppe Stig Nielsen   schedule 03.04.2013