2013-07-15 49 views
0

類型參數的一般推理與約束,以考慮到這些類的其他類型的參數

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

爲什麼不能編譯器推斷的TConfigHostFactory.Create<GenericHost>(new Config())類型?在我看來,TConfig只有一種可能的類型?

我不會從編譯器得到一個推論錯誤,但:

類型「GenericHost」必須轉換爲HostBase<TConfig>,以便在通用方法「THost HostFactory.Create<THost, TConfig>(TConfig)使用它作爲參數「THost」 '

這個錯誤似乎很奇怪,因爲這確實編譯了:HostBase<Config> h = new GenericHost()

我錯過了什麼?

回答

2

你不能在方法調用中推斷出的一些類型參數。泛型類型推斷或者推斷全部類型參數,或者無。沒有辦法從參數中推斷出THost(可能有多個類來自HostBase<Config>),這意味着您基本上不能對該方法使用類型推斷。看看這個具體的例子,我想你會發現使用類型推斷是非常棘手的,因爲關係的工作方式。

+0

啊,不記得那個限制。是的,我想將'THost'參數移動到類中,但是因爲我需要在'TConfig'上限制它不起作用...原因是有其他非泛型實現'HostBase',我的目標是無論類型如何都對所有實例有相同的語法。但我想這是不可能的,如果不改變一些基礎,然後 – carlpett

+0

@carlpett:一個類似的問題更詳細地回答(也由斯基特先生):http://stackoverflow.com/questions/15619038/is-there-一個語法此結果一顛倒型推理 –