c#模板成员函数
本文关键字:函数 成员 | 更新日期: 2023-09-27 18:08:05
如何在c#中定义模板成员函数例如,我将填充任何支持Add(…)成员函数的集合,请查看下面的示例代码
public class CInternalCollection
{
public static void ExternalCollectionTryOne<T<int>>(ref T<int> ext_col, int para_selection = 0)
{
foreach (int int_value in m_int_col)
{
if (int_value > para_selection)
ext_col.Add(int_value);
}
}
public static void ExternalCollectionTryTwo<T>(ref T ext_col, int para_selection = 0)
{
foreach (int int_value in m_int_col)
{
if (int_value > para_selection)
ext_col.Add(int_value);
}
}
static int[] m_int_col = { 0, -1, -3, 5, 7, -8 };
}
ExternalCollectionTryOne<…>(…)将是首选类型,因为int类型可以显式定义,但会导致错误:
Type parameter declaration must be an identifier not a type
The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
ExternalCollectionTryTwo<…>(…)导致错误:
'T' does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)...
我希望问题是明确的-有什么建议吗?
----------------------------- 编辑 --------------------------
使用接口ICollection<…>没有模板成员工作得很好,感谢所有的这个提示,但是我仍然不能成功地定义成员模板(泛型)函数
一个更简单的例子…如何定义这个
public class CAddCollectionValues
{
public static void AddInt<T>(ref T number, int selection)
{
T new_T = new T(); //this line is just an easy demonstration to get a compile error with type T
foreach (int i_value in m_int_col)
{
if (i_value > selection)
number += i_value; //again the type T cannot be used
}
}
static int[] m_int_col = { 0, -1, -3, 5, 7, -8 };
}
您可以将其限制为ICollection<T>
。
public static void ExternalCollectionTryTwo<T>(ICollection<T> ext_col, int para_selection = 0)
{
foreach (int int_value in m_int_col)
{
if (int_value > para_selection)
ext_col.Add(int_value);
}
}
但是,您只添加了int
s。
这对你来说应该很好:
public static void ExternalCollectionTryTwo(ICollection<int> ext_col, int para_selection = 0)
{
foreach (int int_value in m_int_col)
{
if (int_value > para_selection)
ext_col.Add(int_value);
}
}
关于给出的泛型类型的答案,如果我理解得好,你希望有一个整数以外的东西的集合,所以这里是选项:
public class CInternalCollection<T> where T : IComparable
{
private T[] m_T_col;
private CInternalCollection() { }
public CInternalCollection(T[] m_T_col)
{
this.m_T_col = m_T_col;
}
public void ExternalCollection(ICollection<T> ext_col, T para_selection)
{
foreach (T value in m_T_col)
{
if (value.CompareTo(para_selection) > 0)
ext_col.Add(value);
}
}
}
例子:
class Program
{
static void Main(string[] args)
{
int[] m_int_col = {0,1,2};
CInternalCollection<int> myCol = new CInternalCollection<int>(m_int_col);
ICollection<int> ext_int_col = new List<int>();
ext_int_col.Add(-1);
ext_int_col.Add(3);
ext_int_col.Add(2);
ext_int_col.Add(5);
myCol.ExternalCollection(ext_int_col, 1);
}
}