【问题标题】:Overload-resolution in generic constructors [duplicate]泛型构造函数中的重载解决方案
【发布时间】:2017-06-05 10:15:29
【问题描述】:

我创建了一个模型类来说明问题:

 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");
        }
    }

如果我构建任何字符串对象会怎样?没有办法区分这两个构造函数。用相同数量的参数定义另一个构造函数是一种不好的做法?

【问题讨论】:

  • 其实是有办法的。如果可能,编译器将使用非泛型重载。所以如果字符串有什么特别之处,这不是一个坏习惯
  • 您的问题到底是什么?这是如何工作的(阅读有关重载解决方案,请参阅副本),将调用哪个(运行它)或者这是否是一种不好的做法(基于意见)?如果您提供一个真实的用例,则可以显示替代方案。该用例将解释为什么您认为首先需要字符串重载,然后将遵循如何减轻歧义。再次,参见重复。 :)

标签: c# generics overloading overload-resolution constructor-overloading


【解决方案1】:

编译器将始终选择最具体的重载方法,即签名中带有string参数的方法。即使您有一个通用方法(或在您的情况下为构造函数),显式类型的 string 参数也是最具体的一个。因此

new Anything<string>("test");

会输出

我是字符串类型的构造函数


从软件工程的角度来看,这确实是一种不好的做法,因为类的用户并不清楚为什么带有 string 参数的构造函数会表现出与通用构造函数不同的行为。

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2011-06-22
    • 2010-09-13
    • 2019-04-09
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多