通用方法是不是选择最具体的构造函数签名?

Mic*_*ray 7 c# generics

当我使用带有泛型参数的方法来创建另一个对象时,泛型对象不会选择最具体的构造函数.这听起来令人困惑,所以这里有一些示例代码来证明我的意思......

任何人都可以解释为什么这个程序的输出是:

guid    <-- easy - no problem here
object  <-- WHY?  This should also be "guid"?!
Run Code Online (Sandbox Code Playgroud)

...以及如何使泛型Add<T>函数调用正确的构造函数C?这是代码:

void Main()
{
    B b = new B();

    C c = new C(Guid.Empty);
    b.Add<Guid>(Guid.Empty);
}

public class B
{
    List<C> cs = new List<C>();
    public void Add<T>(T v) { cs.Add(new C(v)); }
}

public class C
{
    public C(Guid c) { Console.WriteLine("guid"); }
    public C(object c) { Console.WriteLine("object"); }
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 10

重载解析在编译时完成,而不是在运行时完成.因此,当您new C(v)从该Add<T>方法调用时,编译器不知道T实际上是什么Guid,因此它使用唯一保证兼容的重载,这是public C(object c)

  • 这里的教训是:C#不是C++,泛型不是模板.泛型是*类型系统*的一部分,它是一个逻辑框架,编译器在其中对源代码的含义进行逻辑演绎.模板更像是一个*lexical*系统; 您可以将模板实例化视为简单地替换文本然后从头开始分析新文本. (3认同)