1

我创建了一个样机类ilustrate问题:超载分辨率在通用构造

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

请告诉我,如果我建字符串对象的什么吗?没有办法区分这两个构造函数。使用相同数量的参数定义另一个构造函数是一种糟糕的做法吗?

Two constructos looks equal

+0

其实有办法。如果可能,编译器将使用非泛型重载。所以,如果有关于字符串的特殊情况,这不是一个坏习惯 –

+0

你的问题到底是什么?这是如何工作的(阅读重载决议,看重复),哪一个会被调用(运行它)还是这是一个不好的做法(基于意见)?如果您提供真实的用例,则可以显示替代方案。这个用例将解释为什么你认为你首先需要一个字符串重载,并从中解释如何减少歧义。再次看到重复。 :) – CodeCaster

回答

1

编译器总是选择最具体的重载方法,这是一个在其签名的string参数。即使你有一个通用的方法(或你的情况下的构造函数),明确键入的string参数是最具体的参数。因此

new Anything<string>("test"); 

将输出

我字符串输入构造


从软件工程的角度来看,这的确是一个不好的做法,因为它不会是清楚该类的用户为什么例如具有string参数的构造函数会显示与通用参数不同的行为。