如何创建一个泛型方法,该方法可以将值变量初始化为 0 或将变量引用为新(非 null)
本文关键字:变量 初始化 引用 null 方法 创建 何创建 一个 泛型方法 | 更新日期: 2023-09-27 17:56:45
我有这样的东西
V Func<V>()
{
// do stuff
V res = default(V);
// more stuff
return res;
}
问题是我希望 res 为 0 或 V 的新实例
我尝试创建 2 种方法
Func<V> where T: new()
Func<V> where T: struct
但令人惊讶的是,这是不允许的
我的解决方法是有 2 个函数
FuncNew<V> where T: new()
...
res = new V();
....
和
FuncDefault<V> where T: struct
...
res = default(V)
...
编辑:总结答案
new(T) 将新建引用或值类型;我没有意识到
您可以使用
new()
约束:
private V Func<V>() where V : new()
{
// do stuff
V res = new V();
// more stuff
return res;
}
值类型将初始化为全零,任何引用类型都将使用其 no-args 默认构造函数进行初始化。
如果引用类型没有 no-args 构造函数,则不能与此方法一起使用,并且您将不得不使用其他方式(SO 的其他地方有很多解决此问题的方法,例如将参数传递给模板化的 C# 泛型 new() )
所以您希望结果对象为整数零,还是泛型类型的新实例?这是不可能的,因为泛型类型参数仅对整数类型有效,除非您将 object
指定为返回类型。
public object Func<T>()
where T: new()
{
if(something)
return 0;
return new T();
}
如果尝试创建默认初始值设定项,则只需更新类型即可。这应该适用于整数和引用类型。
public T Func<T>()
{
return Activator.CreateInstance<T>();
}