2

コンパイラ エラーが発生し、コンパイラが私がやろうとしていることを理解できない理由を理解するのに苦労しています。:)

抽象基本クラスから始まります。

abstract class Base
{
    protected abstract Task<T> DoSomething<T>() where T : MyObject;
}

Tタイプ である必要があるの制約を指定していることに注意してくださいMyObject

Base今、私はこの方法から派生しようとしています:

class Derived : Base
{
    protected override Task<T> DoSomething<T>()
    {
        return Task.FromResult<MyObject>(new MyObject());
    }
}

Task<MyObject>制約を尊重する を返すので、これは有効に見えます。

しかし、コンパイラは DoSomething の実装について不平を言っています。

System.Threading.Tasks.Task<MyObject>タイプ ' ' を ' ' にSystem.Threading.Tasks.Task<T>暗黙的に変換することはできません

派生クラスで制約を強化することができないので、これをどのように整理するか非常に疑問です!

4

2 に答える 2

2

のみMyObjectに制約するのではなく、 から派生したものに制約しMyObjectます。それから作成MyOtherObjectして を呼び出すと、ではなくDoSomething<MyOtherObject>()を返そうとします。に暗黙的にキャストすることはできません。したがって、コードは有効ではなく、コンパイルされません。Task<MyObject>Task<MyOtherObject>Task<MyObject>Task<MyOtherObject>

現在のコードでは、ジェネリックは必要ありません。署名:

protected abstract Task<MyObject> DoSomething();

あなたのニーズを満たします。

于 2013-11-07T08:34:20.960 に答える
0

オーバーライドすると、すべてがオーバーライドされます。この場合、T に対する制約は無効になります。

于 2013-11-07T08:31:17.130 に答える