泛型构造函数中的重载解析

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 参数的构造函数会表现出不同的行为比通用的。