无法理解通用方法

时间:2010-09-06 07:54:49

标签: 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>,则表示所有参数必须是T1T2

类型

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

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

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

提前致谢:)

7 个答案:

答案 0 :(得分:7)

如果方法确实以您完全键入 的方式定义:

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

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

如果是拼写错误,第二个参数读取T2 p,那么DaeMoohn是正确的。


<强>更新

  

如果有<T1>,那么所有输入   参数必须是T1类型和if   <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)

此方法采用一些TInput值序列(coll)和一些委托指向接受TInputTSummary参数的方法({{1} })。该方法返回类型为action的对象。

您的第一个示例令人困惑的是,其中一个泛型类型参数TSummary恰好发生在方法签名本身的任何位置。这仅表示T2 与参数或返回值无关。但它仍然可以在方法中使用。

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

T2

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

string

这里的要点是,您的第一个示例中的return typeof(T).FullName; 必须(如果有的话)仅影响方法本身的内部。再次: 与参数或返回值相关。

答案 1 :(得分:2)

public T1 methodName <T1,T2>(T1 t, T1 p)可让您传递2个通用参数 因此,您可以使用以下格式调用此方法

methodName<string, string>("hello", "world");
methodName<string, int>("hello", "world");
methodName<int, string>(1, 2);

注意:我没有找到使用T2&amp;不知道,为什么在方法签名没有使用时需要它。因此,我以字符串形式传递上述所有参数。

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

答案 2 :(得分:1)

<T1,T2>部分告诉编译器T1T2是类型参数。简单地用“T”开始他们的名字是不够的,这只是一个惯例。一旦定义了类型参数名称,就可以使用在方法和方法签名中使用类型的名称。

答案 3 :(得分:1)

  

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

     

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

     

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

第二个参数的类型为Action<TInput, TSummary>,而不是Action

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

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