int []使用“错误”的Console.WriteLine重载

埃文·弗里施(Evan Frisch)

我正在与一位同事一起研究一些基本的C#教程,尽管遇到了一个有趣的难题,但我们遇到了。

以下代码按预期工作:

string[] strings = { "1", "2", "3" };
Console.WriteLine("{0}, {1}, {2}", strings);

它获取字符串数组,并使用方法Console.WriteLine(string format, params object[] arg)重载将字符串“ 1、2、3”输出到控制台WriteLine

但是,以下代码不起作用:

int[] ints = { 1, 2, 3 };
Console.WriteLine("{0}, {1}, {2}", ints);

您会收到一条FormatException消息,Index (zero based) must be greater than or equal to zero and less than the size of the argument list.使用Intellisense,我可以看到它正在尝试使用Console.WriteLine(string format, object arg0)重载,这就是我们收到该消息的原因,ints尽管它显然是一个数组,但它并没有被视为数组。

如果我们切换到更明显的位置:

int[] ints = { 1, 2, 3 };
Console.WriteLine("{0},{1},{2}", ints[0], ints[1], ints[2]);

它可以再次工作并再次使用params object[]过载。

是否有原因将其int[]视为方法的数组?Int32结构的事实会有所作为吗?如果是这样,为什么?

编辑

我用相同的格式对双精度进行了快速测试,但也没有用,这让我认为这确实是类型是struct的事实,但我仍然不明白为什么这样做会有所作为。

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

string对象适用的原因C#的数组协方差功能。

对于任何两个引用类型AB,如果存在从A的隐式或显式引用转换B,则从数组类型A[]到数组类型也存在相同的引用转换B[]

从隐式转换stringobject,因此WriteLine将您的string[]数组替换为object[]array。

没有协方差int[],因为int不是引用类型。如果要使用显式转换,可以这样进行:

object[] ints = (new int[]{ 1,2,3 }).Cast<object>().ToArray();
Console.WriteLine("{0}, {1}, {2}", ints);       

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Console.WriteLine()是否需要这么多参数重载?

如何Console.Writeline IEnumerable <(int a,int b,int c)>?

为什么Microsoft重载方法Console.Write()和Console.WriteLine()?C#

使用类和int参数作为模板的C ++重载operator +

.NET Core上的Roslyn脚本API:为什么编译器会抱怨“错误CS1501:WriteLine没有重载需要2个参数”?

为什么使用int的函数重载比使用unsigned char的函数重载优先?

使用Console.WriteLine()的复杂I / O

如何使用 Console.WriteLine 打印变量

使用重载比较运算符从int派生的类访问原始int比较

Console.Writeline基础

Console.WriteLine(“”); 卡住

Console.WriteLine与打印

frida:错误:a():参数类型不匹配:重载('int','int','long','java.lang.String','java.lang.Object')

用short和int重载

使 int 重载成为首选

为什么最负的int值会导致有关歧义函数重载的错误?

g ++错误:重载的“ abs(unsigned int)”的调用不明确

Console.WriteLine()与Console.WriteLine(string.Empty)

C# Console.WriteLine()

IEnumerable和console.writeline

c# Console.WriteLine();

使用向量重载<<的C ++错误

什么阻止了 Boost.Format 表单使用我的流运算符重载可选的 int?

迭代器运算符重载++&-具有参数int但未使用

使用字符串的Console.writeline

如何为Console.WriteLine重写使用自己的类?

console.writeline 与 console.write

如何重载对象=常量int +对象

Java重载:Number,Number; int,Double