C#创建包含泛型集合的泛型方法并调用Sum()

xinglong
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
帕维尔·阿尼克豪斯基(Pavel Anikhouski)

我不知道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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#中调用泛型方法

来自分类Dev

如何创建 C# 泛型方法

来自分类Dev

C#集合类型约束泛型

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

如何在C#中调用泛型重载方法

来自分类Dev

C#在方法调用中扩展泛型类

来自分类Dev

具有泛型转换的C#调用阴影方法

来自分类Dev

C#在方法调用中扩展泛型类

来自分类Dev

在C#中创建泛型类的字典的辅助方法

来自分类Dev

如何在C#中创建泛型方法重载?

来自分类Dev

创建泛型泛型的集合-字典协方差

来自分类Dev

声明C#泛型类型方法

来自分类Dev

C#中的静态泛型方法

来自分类Dev

C#泛型方法选择

来自分类Dev

c#使用泛型方法

来自分类Dev

如何调用泛型方法?

来自分类Dev

在泛型上调用方法?

来自分类Dev

泛型的调用对象方法

来自分类Dev

可调用和泛型的集合

来自分类Dev

如何创建泛型方法

来自分类Dev

如何从泛型方法调用非泛型方法

来自分类Dev

Java泛型-从泛型类型的方法调用特定方法

来自分类Dev

从非泛型方法调用泛型方法

来自分类Dev

C#中的多类泛型集合

来自分类Dev

返回C#中作为集合的泛型类型

来自分类Dev

C#中的多类泛型集合

来自分类Dev

泛型类型集合

来自分类Dev

C#泛型:通配符