将数据添加到通用字符串数组C#

时间:2011-03-04 20:23:00

标签: c# generics arrays

我正在学习C#中的泛型,我正在尝试创建一个通用数组并添加一些字符串。我可以轻松地为其添加int值,但我无法弄清楚如何使其与strings一起使用。当我尝试使用字符串时,我得到NullReferenceException

我有一个名为myArray的课程,它看起来像这样:

class MyArray<T> : IComparable<T>, IEnumerable<T>, IEnumerator<T>
{
    T[] data = new T[10];
    int current = -1;

    public T[] Data
    {
        get { return data; }
    }

    public void Add(T value)
    {
        for (int i = 0; i < data.Length; i++)
        {
            if (data[i].Equals(default(T)))
            {
                data[i] = value;
                return;
            }
        }
        T[] tmp = new T[data.Length + 10];
        data.CopyTo(tmp, 0);
        Add(value);
    }

在我的mainform中,我添加了这样的数据:

class Program
{
    static void Main(string[] args)
    {
        MyArray<string> StringArray = new MyArray<string>();

        StringArray.Add("ONE");
        StringArray.Add("TWO");
    }
}

3 个答案:

答案 0 :(得分:3)

default的{​​{1}}为string,因为它是引用类型,而不是值类型。您正在构建一个类型为null的新数组,这会导致数组填充默认值T[],在本例中为T

在此之后,null会在您尝试拨打data[i].Equals(default(T))时抛出NRE。

答案 1 :(得分:1)

您的数组正在使用空值进行初始化,因此您在此行获得了一个新内容:

if (data[i].Equals(default(T)))

答案 2 :(得分:0)

if (data[i].Equals(default(T)))是问题所在。在新字符串(或任何其他引用类型)数组中,

var array = new String[10];

默认情况下,数组中的每个元素都是null。所以当你说

data[i].Equals(default(T)

data[i]null,您正在调用null引用上的方法,从而导致抛出异常。

对于值类型不会发生这种情况,因为数组被初始化为值类型的默认值。

这是泛型问题的一部分 - 您不能总是将引用类型和值类型视为相同。

请尝试此操作,以避免default

private int _currentIndex = 0;
public void Add(T value)
{
    data[_currentIndex] = value;
    _currentIndex++;
    if(_currentIndex == data.Length)
    {
       T[] tmp = new T[data.Length + 10];
        data.CopyTo(tmp, 0);
        data = tmp;
        _currentIndex = 0;
    }          
}