我理解这句话: -
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)
定义说所有输入必须是TInput
或TSummary
,但第二个参数的类型为Action
。所以我仍然感到困惑。
提前致谢:)
答案 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
)和一些委托指向接受TInput
和TSummary
参数的方法({{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>
部分告诉编译器T1
和T2
是类型参数。简单地用“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)
通过简化程序,您可以解决整个问题。例如。在这种情况下,使用对象表而不是泛型。