我正在学习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");
}
}
答案 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;
}
}