using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Fun<T>(List<T> list)
{
// The foreach works
foreach(T i in list)
{
Console.WriteLine(i);
}
//The following line has error: List<T>' does not contain a definition for 'Sum'
Console.WriteLine(list.Sum());
}
public static void Main()
{
var arr = new int[]{1,2,3,4};
Fun<int>(arr.ToList());
}
}
的foreach
工作,但list.Sum()
没有。表明:
“列表”不包含“和”的定义,并且最佳扩展方法重载“ Queryable.Sum(IQueryable)”需要类型为“ IQueryable”的接收器
如果我声明为public static void Fun(List<int> list)
,那么它起作用了,有人知道为什么吗?
类似的C ++版本可以工作:
#include <iostream>
#include <vector>
using namespace std;
template<class T>
struct MyList
{
MyList(vector<T> v) : m(v){};
vector<T> m;
T Sum()
{
T sum = T();
for(auto i : m)
{
sum += i;
}
return sum;
}
};
template<class T>
void Fun(MyList<T> list)
{
cout << list.Sum() << endl;
}
int main(int argc, char *argv[])
{
Fun(MyList<int>({1,2,3}));
Fun(MyList<double>({1.0,2.0,3.0}));
}
output:
6
6.3
我不知道C ++在这种情况下是如何工作的,但是在您的代码中,泛型类型参数T
不限于任何类型,并且编译器也不知道是否T
支持+
运算符。您可以dynamic
在此处使用关键字,以允许编译器在运行时确定类型
public static void Fun<T>(List<T> list)
{
dynamic sum = default(T);
foreach (T i in list)
{
Console.WriteLine(i);
sum += (dynamic)i;
}
Console.WriteLine(sum);
}
或者只是一行 var sum = list.Aggregate((arg1, arg2) => (dynamic)arg1 + arg2);
但是您应该非常小心。如果您传递的类型不支持或重载+
,则在运行时会出现异常。您可以将泛型约束应用于T
并允许它仅匹配数字类型where T : struct, IComparable, IComparable<T>, IConvertible, IEquatable<T>, IFormattable
(这很长,但是目前尚无泛型约束来匹配C#中的数字类型)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句