我正在尝试在如下的静态类中创建泛型方法 我将在运行时传递paramData。
doc.xpath(
'//ns:jdbc-data-source/ns:jdbc-driver-params/ns:url',
namespaces={
'ns':'http://xmlns.oracle.com/weblogic/jdbc-data-source'
}
)
这是有效的,但只要我按照下面的方法名称删除[<Element {http://xmlns.oracle.com/weblogic/jdbc-data-source}url at 0x1049877a0>]
,它就会开始显示
类型错误。为什么会这样。
public static void InsertBulk<T>(string procedure, IDictionary<T,T> paramData)
{
//Body
}
据我所知,我可以使用<T>
调用此方法
所以,为什么要求方法名称。有什么用。
答案 0 :(得分:2)
这里有两个独立的事情要理解:
您需要在方法声明中包含<T>
,以使其成为通用方法。没有它,编译器不知道T
是什么......它期望它是常规类型的名称。
现在当你调用泛型方法时,可以像这样指定类型参数:
InsertBulk<int>("MyProc", myParams);
这里只有一个类型参数:int
。 (由于下面描述的原因,这不会编译,但它是指定类型参数的一个示例。)
...或者您可以让编译器根据方法的参数尝试推断类型参数 - 在这种情况下,它会查看myParams
并找出什么type参数必须是使调用编译。类型推断的细节非常复杂,但它们的设计使得在合理的情况下,您可以在不指定类型参数的情况下离开。
在您的情况下,由于myParams
是IDictionary<int, string>
,因此无论如何都无法编译,因为没有T
IDictionary<int, string>
是IDictionary<T, T>
。您可能会使您的方法改为两个类型参数:
public static void InsertBulk<TKey, TValue>(
string procedure, IDictionary<TKey, TValue> paramData)
这一点你可以调用InsertBulk("MyProc", myParams)
,编译器会推断出int
和string
的类型参数。