无法理解通用方法

TCM*_*TCM 0 c#

我理解这句话: -

List<string> a;

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

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

public T1 methodName <T1,T2>(T1 t, T1 p)

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

编辑: - 基于我收到的答案,我猜<T1, T2>是有,所以输入参数看起来相似.如果<T1>在那里,则所有输入参数必须是T1类型,如果<T1,T2>存在则意味着所有参数必须是T1或者类型T2

但这句话究竟是什么意思: -

public static TSummary Accumulate <TInput, TSummary> (IEnumerable <TInput> coll, Action <TInput, TSummary> action)

该定义说,所有的输入必须在任TInputTSummary但第二个参数是类型Action.所以我仍然感到困惑.

提前致谢 :)

Dan*_*Tao 7

如果方法确实是按照您输入的方式确定的:

public T1 methodName <T1, T2>(T1 t, T1 p)
Run Code Online (Sandbox Code Playgroud)

...然后T2与参数类型或返回类型无关.然而,它可能会影响方法内部发生的事情(例如,该方法可以在内部调用typeof(T2)并对其执行某些操作).

如果它是一个拼写错误,并且第二个参数应该读取T2 p,那么DaeMoohn是正确的.


更新:

如果<T1>在那里,则所有输入参数必须是T1类型,如果 <T1,T2>存在则意味着所有参数必须是T1或T2类型

没有!不准确的!

参数的类型在参数声明中指定:(T1 t, T1 p)- 两者都必须是类型T1(就像声明参数一样,(int x, int y)它们都必须是int).

我们来看看那个Accumulate签名:

public static TSummary Accumulate <TInput, TSummary> (IEnumerable <TInput> coll, Action <TInput, TSummary> action)
Run Code Online (Sandbox Code Playgroud)

此方法采用一些TInput值(coll)和一些委托指向接受a TInputTSummaryparameter(action)的方法.该方法返回一个类型的对象TSummary.

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

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

string GetTypeName<T>();
Run Code Online (Sandbox Code Playgroud)

T上述签名意味着什么?它不是返回类型(string),也不在参数列表中(没有).这有什么意义吗?据推测,它表明你想要什么类型的名字.因此,内部方法可能如下所示:

return typeof(T).FullName;
Run Code Online (Sandbox Code Playgroud)

这里的要点是,T2在您的第一个示例中,必须(如果有的话)只影响方法本身的内部.还是那句话:这是相关的参数或者返回值.