如何创建一个泛型方法,该方法可以将值变量初始化为 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) 将新建引用或值类型;我没有意识到

如何创建一个泛型方法,该方法可以将值变量初始化为 0 或将变量引用为新(非 null)

您可以使用

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>();
}