C# 无法理解泛型方法

C# 无法理解泛型方法,c#,C#,我理解这种说法:- 列表a 这意味着a只能包含string类型的值 但当与方法一起使用时,我会感到困惑。例如 publict1methodname(t1t,t1p) 我知道该方法返回类型为T1的对象,并接受类型为T1的对象。但是的意义是什么?为什么需要它 编辑:- 根据我收到的答案,我猜的存在使得输入参数看起来很相似。如果存在,则所有输入参数必须为T1类型;如果存在,则意味着所有参数必须为T1或T2 但这句话的确切含义是什么:- 公共静态TSummary累计(IEnumerable coll,A

我理解这种说法:-

列表a

这意味着a只能包含
string
类型的值

但当与方法一起使用时,我会感到困惑。例如


publict1methodname(t1t,t1p)

我知道该方法返回类型为
T1
的对象,并接受类型为T1的对象。但是
的意义是什么?为什么需要它

编辑:- 根据我收到的答案,我猜
的存在使得输入参数看起来很相似。如果
存在,则所有输入参数必须为T1类型;如果
存在,则意味着所有参数必须为
T1
T2

但这句话的确切含义是什么:-

公共静态TSummary累计(IEnumerable coll,Action-Action)

该定义表示所有输入必须是
TInput
TSummary
,但第二个参数的类型为
Action
。所以我还是很困惑


提前感谢:)

这意味着methodName返回类型为T1的对象,并接受类型为T1和T2的两个参数。

公共T1 methodName(T1 t,T1 p)
允许您传递两个通用参数。
因此,可以按以下形式调用此方法

methodName<string, string>("hello", "world");
methodName<string, int>("hello", "world");
methodName<int, string>(1, 2);
methodName(“你好”,“世界”);
方法名称(“你好”,“世界”);
方法名称(1,2);
注意:我没有找到使用
T2
&不知道,当方法签名没有使用它时为什么需要它。因此,我以字符串形式传递上述所有参数


简单地说,这意味着该方法接受2个参数,可以是您选择的任何类型(除非有限制)。

如果该方法确实是以您准确键入的方式定义的:

此方法获取一些
TInput
值序列(
coll
),以及一些指向接受
TInput
TSummary
参数(
action
)的方法的委托。该方法返回类型为
TSummary
的对象

第一个示例中令人困惑的是,其中一个泛型类型参数,
T2
,恰好不在方法签名本身的任何地方。这仅仅意味着
T2
与参数或返回值都不相关。但它仍然可以在该方法中使用

例如,考虑这个(虚构的)方法:


这里的要点是,在第一个示例中,
T2
必须(如果有的话)只影响方法本身的内部。同样:它与参数或返回值无关。

为了定义像这样的泛型方法参数的类型,你应该使用T1,T2符号。

部分告诉编译器,
T1
T2
是类型参数。仅仅以“T”开头是不够的,这只是一种惯例。定义了类型参数名称后,可以在方法和方法签名中使用类型的任何位置使用这些名称

但这句话的确切含义是什么:-

公共静态TSummary累计(IEnumerable coll,Action-Action)

定义说所有输入必须是TInput或TSummary,但第二个参数是Action类型。所以我还是很困惑


第二个参数的类型是
Action
,而不是
Action

您可以通过简化程序来解决整个问题。例如,在这种情况下,使用对象表而不是泛型。

最后一个不正确。根据OP提供的签名,您无法将“hello”和“world”传递给
methodName
(两个参数都必须是
int
)类型。但按照他的编写方式,参数实际上都是
T1
类型。那么。。。它接受两个类型参数T1和T2,以及两个类型为T1的参数。仅更改T2可能会更改方法的行为,即使所有正常参数和返回值都是T1,因此它是有效的。但这是不寻常的。你是对的,我没有检查第二个参数类型!“如果存在,则所有输入参数必须为T1类型;如果存在,则意味着所有参数必须为T1或T2类型”——该语句不正确。
并不是指T1或T2,它只是表示该方法使用了两种不同的类型。(您可以在MSDN上阅读这些内容)。操作表示委托,该委托使用传递给它的参数执行某些操作,而不返回结果。存在的所有类型都是输入类型,因此可以说Action有3个类型为T1、T2、T3的输入参数。Func是一个委托,它可以接受一些参数并返回一个值,因此Func定义中的最后一个类型是返回值的类型:Func在内部使用T1和T2并返回T3。@Dan:-
此方法接受一些TInput值序列(coll)和一些指向接受TInput和TSummary参数的方法的委托(行动)。该方法返回类型为TSummary的对象。
你怎么知道该方法返回类型为TSummary的对象?@Nitesh:因为这是该方法的返回类型:
公共静态TSummary acculate…
哦,好的,你说的是
acculate
。我以为你说的是
操作
@Nitesh:不,对不起,我是我可以看出它不是很清楚。但是,是的,我相信你知道,
操作
没有返回类型。感谢道格拉斯,现在我知道它们只是编译器检测类型的名称空间;)否则它会给出编译错误,T1和T2没有定义。-这不是我问题的答案。泛型的整个思想是提供类型安全性。使用对象,可以存储任何
public T1 methodName <T1, T2>(T1 t, T1 p)
public static TSummary Accumulate <TInput, TSummary> (IEnumerable <TInput> coll, Action <TInput, TSummary> action)
string GetTypeName<T>();
return typeof(T).FullName;