泛型构造函数中的重载解析
Overload-resolution in generic constructors
我创建了一个模型 class 来说明问题:
public class Anything<T>
{
/// <summary>
/// Generic typed constructor
/// </summary>
/// <param name="param1"></param>
public Anything(T param1)
{
Console.WriteLine("I'm generic typed constructor");
}
/// <summary>
/// String typed constructor
/// </summary>
/// <param name="param1"></param>
public Anything(string param1)
{
Console.WriteLine("I'm string typed constructor");
}
}
如果我构建 Anything of string 对象怎么办?无法区分这两个构造函数。用相同数量的参数定义另一个构造函数是一种不好的做法吗?
编译器将始终选择最具体的重载方法,即在其签名中带有 string
参数的方法。即使您有一个通用方法(或您的情况下的构造函数),显式类型的 string
参数也是最具体的一个。于是
new Anything<string>("test");
会输出
I'm string typed constructor
从软件工程的角度来看,这确实是一种不好的做法,因为 class 的用户不清楚为什么例如带有 string
参数的构造函数会表现出不同的行为比通用的。
我创建了一个模型 class 来说明问题:
public class Anything<T>
{
/// <summary>
/// Generic typed constructor
/// </summary>
/// <param name="param1"></param>
public Anything(T param1)
{
Console.WriteLine("I'm generic typed constructor");
}
/// <summary>
/// String typed constructor
/// </summary>
/// <param name="param1"></param>
public Anything(string param1)
{
Console.WriteLine("I'm string typed constructor");
}
}
如果我构建 Anything of string 对象怎么办?无法区分这两个构造函数。用相同数量的参数定义另一个构造函数是一种不好的做法吗?
编译器将始终选择最具体的重载方法,即在其签名中带有 string
参数的方法。即使您有一个通用方法(或您的情况下的构造函数),显式类型的 string
参数也是最具体的一个。于是
new Anything<string>("test");
会输出
I'm string typed constructor
从软件工程的角度来看,这确实是一种不好的做法,因为 class 的用户不清楚为什么例如带有 string
参数的构造函数会表现出不同的行为比通用的。