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

コンパイラがTConfigfromの型を推測できないのはなぜHostFactory.Create<GenericHost>(new Config())ですか? TConfig?の可能なタイプは 1 つしかないように思えます。

ただし、コンパイラから推論エラーは発生しません。

タイプ ' 'は、ジェネリック メソッド ' ' でパラメータ' ' として使用するためにGenericHost変換可能である必要がありますHostBase<TConfig>THostTHost HostFactory.Create<THost, TConfig>(TConfig)

これはコンパイルされるため、このエラーは奇妙に思えます: HostBase<Config> h = new GenericHost().

私は何が欠けていますか?

4

1 に答える 1

2

メソッド呼び出し内で一部の型パラメーターだけを推論することはできません。ジェネリック型推論は、すべての型パラメーターを推論するか、または何も推論しません。パラメーターから推論する方法はありませんTHost(から派生する複数のクラスが存在する可能性がありますHostBase<Config>)。これは、基本的にそのメソッドに対して型推論を使用できないことを意味します。

この特定の例を見ると、リレーションシップの仕組みが原因で、型推論をまったく使用するのが難しいことがわかると思います。

于 2013-07-15T07:44:12.840 に答える