0

編集: たぶん、これはより明確で、質問のより重要な定式化です:

一部の汎用インターフェイスIInterface<T>では、汎用型のオブジェクトを返したいと思います。ここで、型引数の1つはの実装である必要がありますIInterface<T>

public class OtherType<T> {}
public interface IInterface<T>
{
    OtherType<IInterface<T>> Operation();
}
public class Impl : IInterface<int>
{
    public OtherType<IInterface<int>> Operation()
    {
        return new OtherType<Impl>();
    }
}

Implを実装しているのでIInterface<int>、このように使用できるのは合理的だと思います。それでも、私はできないようです、私はコンパイラエラーを受け取ります

OtherType<Impl>式タイプをリターンタイプに変換できませんOtherType<IInterface<int>>

4

2 に答える 2

1

OtherType<IInterface<int>>「実装」を意味するのではなく、「OtherType一般的な型パラメータを持つ型である」という意味Interface<int>ですが、それはあなたの言い方ではありません。

リターンタイプが実装されていることを確認したいだけの場合は、IInterface<int>それをリターンタイプとして設定します。

public interface IInterface<T>
{
    IInterface<T> Operation();
}

public class Impl : IInterface<int>
{
    public <IInterface<int>> Operation()
    {
        return new OtherType();
    }
}

どこ

public class OtherType : IInterface<int>
{}

これは、を実装する任意のタイプを返すことができることを意味しますIInterface<int>

それ以外の場合は、ジェネリック型制約を使用して呼び出すことをもう少し制約することができます。

public interface IInterface<T>
{
    TRet Operation<TRet>() where TRet : IInterface<T>;
}

public class Impl : IInterface<int>
{
    public TRet Operation<TRet>() where TRet : IInterface<int>
    {
        return new OtherType();
    }
}

これは、特定のクラスを返すように操作を制約できることを意味します。特定のクラスは、を実装する必要がありますIInterface<int>

それは呼ばれるでしょう:

Impl i = new Impl();
OtherType x = i.Operation<OtherType>();
于 2013-03-27T17:45:19.480 に答える
1

問題はOtherType<T>、クラスであり、汎用クラスではC#での共変性と反変性が許可されていないことです。タイプがどの入力位置にも表示されず、タイプがどの出力位置にも表示されないinterfaces限り、一般的には実行されます。コードサンプルでは、​​共変とマークされた追加のインターフェイスを導入し、リターンタイプを変更することで、コンパイルすることができます。outin

public interface IOtherType<out T> {} // new
public class OtherType<T> : IOtherType<T> { }

public interface IInterface<T>
{
    IOtherType<IInterface<T>> Operation(); // altered
}
public class Impl : IInterface<int>
{
    public IOtherType<IInterface<int>> Operation()
    {
        return new OtherType<Impl>();
    }
}

これが実際にユースケースに追加のメソッド定義に適合するかどうかは、コードスニペットの詳細が限られていることを考えると、あなただけが知ることができるものです。

于 2013-03-27T17:45:30.480 に答える