具有约束到其他类型参数的类型参数的通用推断

时间:2013-07-15 07:38:12

标签: c# generics type-inference

鉴于这些课程:

public abstract class HostBase
{}
public abstract class ConfigBase
{}
public abstract class HostBase<TConfig> : HostBase where TConfig : ConfigBase
{
    protected internal TConfig Config { get; set; }
}
public class GenericHost : HostBase<Config>
{}
public class HostFactory
{
    public static THost Create<THost, TConfig>(TConfig config)
        where THost : HostBase<TConfig>, new()
        where TConfig : ConfigBase
    {
        return new THost { Config = config };
    } 
}

为什么编译器无法从TConfig推断出HostFactory.Create<GenericHost>(new Config())的类型?在我看来,TConfig只有一种可能的类型?

但是我没有从编译器得到推理错误:

  

GenericHost”类型必须可转换为HostBase<TConfig>才能在通用方法“THost

中将其用作参数“THost HostFactory.Create<THost, TConfig>(TConfig)

这个错误看起来很奇怪,因为这会编译:{{1​​}}。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您无法在方法调用中仅推断某些类型参数。通用类型推断或者推断所有类型参数,或者无。无法从参数中推断THost(可能有多个派生自HostBase<Config>的类),这意味着您基本上不能对该方法使用类型推断。

看一下这个具体的例子,我认为你会发现使用类型推断很棘手,因为关系的运作方式。