鉴于这些课程:
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}}。
我错过了什么?
答案 0 :(得分:2)
您无法在方法调用中仅推断某些类型参数。通用类型推断或者推断所有类型参数,或者无。无法从参数中推断THost
(可能有多个派生自HostBase<Config>
的类),这意味着您基本上不能对该方法使用类型推断。
看一下这个具体的例子,我认为你会发现使用类型推断很棘手,因为关系的运作方式。