【问题标题】:What is the difference between T[,] and T[*,*]?T[,] 和 T[*,*] 有什么区别?
【发布时间】:2012-03-10 12:29:13
【问题描述】:

我的谷歌柔术让我失望了。问题在标题中...T[,]T[*,*] 有什么区别? 我正在寻找 2、2-1/2 部分的答案:

  1. 外行人(或超级建筑师)的简单英文解释与示例代码。

  2. 此区别的正式文档的链接。

    奖励:指向定义此内容的 C# 4 规范中的小节和页码。 (不在第 12 节“数组”中)

我得到了这个概念here

【问题讨论】:

  • 您通常从 COM 互操作中获取此类对象。下界非零的 SAFEARRAY,通常为 1。使用 Array.GetValue() 和 GetLower/UpperBound() 进行转换。
  • @Hans,是的,他们是从 Excel PIA 获得的,并遇到了越界问题。见这里:stackoverflow.com/questions/9357092/…

标签: c# arrays c#-4.0 multidimensional-array


【解决方案1】:

T[] 表示 T 的从零开始的数组(array[0] 是它的第一个元素)

T[*] 表示 T 的非从零开始的数组(array[0] 不是它的第一个元素,甚至可以越界)

link from your question 解释说不存在T[*,*] 类型的数组,因为T[,] 的所有多维数组都被视为具有未知下界的数组。

下面的代码 sn-p 显示了如何创建T[*] 的实例。请注意,您不能将其转换为 T[],因为它们是不同的类型。 a[0] 这里会抛出一个 OutOfRangeException,这个数组中第一个元素的索引是 1 (啊,Pascal 的好日子......)

Array a = Array.CreateInstance(typeof(String), new Int32[] { 1 }, new Int32[] { 1 });
Console.WriteLine(a.GetType());    // System.String[*]  

More example code

奖励。 C# 语言规范说,“数组元素的索引范围从 0 到 Length - 1”。显然,该语言不提供对非从零开始的数组的内置支持,它只是您可以创建的自定义数据结构;尽管从某种意义上说,编译器恰好有一个特殊的符号来表示它的类型,而 VS 在调试时为它们使用标准数组可视化工具。

另见:

How to create a 1-Dimensional Array in C# with index starting at 1

C#: Nonzero-based arrays are not CLS-compliant

【讨论】:

  • “从零开始的数组”是否意味着下限 = 0?而“非零基数组”表示下限!=0?
  • @dFlat:是的,就是这个意思
  • 感谢您的详尽解答
【解决方案2】:

其实...

C# 是否支持一维数组...有点。

嗯,确实如此……如果您使用var

首先,您需要使用 ILAsm.exe 将其编译成程序集(我知道,这还不是 C#...):

.assembly extern mscorlib
{
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
    .ver 2:0:0:0
}
.assembly ArrayHelper { }
.module ArrayHelper.dll
.subsystem 0x0003
.class public ArrayHelper   
{
    .method public hidebysig static !!T[...]
        CastTo1D<T>(class [mscorlib]System.Array 'array') cil managed
    {
        ldarg.0
        castclass  !!T[...]
        ret
    }
    .method public hidebysig static !!T[...] Create1D<T>(int32 len) cil managed
    {
        ldarg.0
        newobj     instance void !!T[...]::.ctor(int32)
        ret
    }
    .method public hidebysig static !!T[...]
        Create1D<T>(int32 lowerBound, int32 length) cil managed
    {
        ldarg.0
        ldarg.1
        newobj     instance void !!T[...]::.ctor(int32, int32)
        ret
    }
}

然后你可以这样做:

var my1DArray = ArrayHelper.Create<int>(1, 5);

创建一个长度为 5 且下限为 1 的一维数组。

见鬼,甚至 Visual Studio 也支持这个!

希望你玩得开心。

【讨论】:

  • 有趣。图片没有为我加载...你能修复它吗?
  • @Yacoder:这很奇怪......这对我来说很好。尝试点击 the link 代替吗?
  • 我明白了,它现在可以工作了。是的,IDE 和编译器似乎意识到了这种情况,尽管 C# 规范只考虑从零开始的数组类型。在 C# 中没有类似 string[*] 的语法。
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2019-10-30
相关资源
最近更新 更多