C#调用泛型类赋值数组属性时出现空引用异常问题
问题原因及解决方案
问题根源
你定义的ServiceResponse2<T>类中,Data是数组类型(T?[])。在C#中,引用类型(包括数组)的默认值是null,当你创建ServiceResponse2<string>实例时,Data成员并没有自动初始化一个可用的数组对象,直接通过response.Data[0]赋值时,就会触发Object reference not set to an instance of an object的空引用错误。
解决办法
1. 手动初始化数组后再赋值
在给数组元素赋值前,先创建一个指定长度的数组实例:
ServiceResponse2<string> response = new ServiceResponse2<string>(); response.Success = true; response.Message = "success"; // 初始化长度为2的字符串数组 response.Data = new string[2]; response.Data[0] = filename; response.Data[1] = outname;
2. 给ServiceResponse2<T>添加构造函数自动初始化数组
修改类的定义,通过构造函数确保数组被初始化:
public class basic { public bool Success { get; set; } = false; public string Message { get; set; } = string.Empty; } public class ServiceResponse2<T> : basic { public T?[] Data { get; set; } // 无参构造:默认初始化空数组 public ServiceResponse2() { Data = Array.Empty<T?>(); } // 带参构造:指定数组长度 public ServiceResponse2(int arrayLength) { Data = new T?[arrayLength]; } }
调用时可以直接指定数组长度:
// 创建时指定数组长度为2 ServiceResponse2<string> response = new ServiceResponse2<string>(2); response.Success = true; response.Message = "success"; response.Data[0] = filename; response.Data[1] = outname;
3. 改用List<T?>替代数组(更灵活)
如果你的数据长度不确定,使用泛型列表会更方便,它可以自动扩容,且默认就能初始化空列表:
public class ServiceResponse2<T> : basic { public List<T?> Data { get; set; } = new List<T?>(); }
调用时直接添加元素即可:
ServiceResponse2<string> response = new ServiceResponse2<string>(); response.Success = true; response.Message = "success"; response.Data.Add(filename); response.Data.Add(outname);
内容的提问来源于stack exchange,提问作者CapedCrusader01
相关产品推荐
相关产品推荐

