C# 调用泛型方法

C# 调用泛型方法,c#,generics,C#,Generics,假设我有一个泛型方法。在指定类型的情况下调用方法与不指定类型的情况下调用方法有什么区别 何时强制指定类型 Write(1); Write<int>(1); Write<string>("test"); Write("test"); private static void Write<T>(T param) { Console.WriteLine(param); } Write(1); 写(1); 写入(“测试”); 写入(“测试”); 私有静态无

假设我有一个泛型方法。在指定类型的情况下调用方法与不指定类型的情况下调用方法有什么区别

何时强制指定类型

Write(1);
Write<int>(1);
Write<string>("test"); 
Write("test");

private static void Write<T>(T param)
{
    Console.WriteLine(param);
}
Write(1);
写(1);
写入(“测试”);
写入(“测试”);
私有静态无效写入(T参数)
{
控制台写入线(参数);
}

当编译器无法推断类型时,或者当您对编译器的推断不满意时,必须指定类型。

在这种情况下,这不是强制性的,因为参数
param
是泛型的(编译器会这样解析它)


这意味着每当类型参数未作为参数提供时,它都是必需的。

编译器将在编译时尝试解析类型参数。在可能的情况下,它会自动完成,而无需指定显式类型。在所有其他情况下,当编译器无法确定类型参数时,编译器将抛出错误,您无法编译应用程序

在示例
Write(1)
中,参数
1
的类型为
int
。因此编译器推断
T
必须是
int
,因此调用相当于
Write(1)
。与
Write(“test”)
类似,
的“test”
类型为
string
,因此编译器将推断
T
string

这通常适用于传递给函数的参数的编译时类型。因此,如果您有一个编译时类型为
object
的字符串,
T
将是
object

object arg = "foo";

Write(arg); // arg is object

// this is equivalent to this:
Write<object>(arg);

但是,当编译器甚至无法推断一个类型参数时,您必须在调用中指定所有类型参数。

这两种类型参数之间没有区别

Write<string>("test");
Write("test");
写入(“测试”);
写入(“测试”);
但是,当您指定的不是参数的确切类型,而是可转换的参数(例如)时,就有区别了

Write<object>("test");
Write("test");
写入(“测试”);
写入(“测试”);
只要尝试打印类型参数,就会看到不同之处

private static void Write<T>(T param)
{
    Console.WriteLine(typeof(T));
    Console.WriteLine(param);
}
私有静态无效写入(T参数)
{
控制台写入线(类型为(T));
控制台写入线(参数);
}

感谢您的详细解释。
private static void Write<T>(T param)
{
    Console.WriteLine(typeof(T));
    Console.WriteLine(param);
}