我想按照以下几行编写泛型方法:
public IEnumerable<T> S<T> (List<T> source)
{
//dosomething with source
if (someCondition)
yield return null;
else
yield return someNonNullItem;
}
T可以是值类型(例如int),可空类型(例如int?)或ref类型(例如字符串)。在所有这三种情况下,我希望能够返回空值。
// dosomething块非常通用,涉及到移动的东西,并且可以在没有修改的情况下用于所有类型。类似地,(someCondition)布尔检查没有任何类型依赖。
一些注意事项:
目前,我不得不写三个函数,其中一个必须有不同的名称(因为类型约束不被视为方法签名的一部分)。这三个功能具有相同的主体(为简洁起见未示出)。
public IEnumerable<T?> S<T>(List <T> source) where T:struct
{
}
public IEnumerable<T?> S<T>(List <T?> source) where T : struct
{
}
public IEnumerable<T> S4Ref<T>(List <T> source) where T : class
{
}
在前两个方法中,我需要T:struct约束才能返回Nullable。在第三种方法中:(a)我需要一个新名称S4Ref,以避免与第一种方法发生冲突,并且,(b)我需要T:类约束才能返回null。
实际上,我必须编写很多这样的S方法,如果我遵循上述方法,我将不得不为每个方法编写三个版本。我还将它们转换为List
的扩展方法问题:
目前我正在转向使用T4模板来解决这个问题。