1

流暢な API の拡張メソッド用に 3 つのマーカー インターフェイスがあります。

interface IOne { }
interface ITwo { }
interface IOneOrTwo : IOne, ITwo { }

および次の拡張メソッド:

public static IOneOrTwo Foo (this IOne obj, string arg)
{
    // do something with arg
    return obj; // <- possible without cast?
}

質問:キャストせずに obj を返すことは何とか可能ですか? 通常、この状況では明示的にダウンキャストする必要がありますが、これらのインターフェイスのいずれも、基礎となるオブジェクトに何らかのメソッド/プロパティ/その他のものを要求するものではありません。

注: 実際の実装クラスは、すべてのインターフェイスを実装します。

質問 2: なぜ implementationが自動的に実装を type にもしないのIOneですか?ITwoIOneOrTwo

4

2 に答える 2

6

あなたの実装は後退している可能性があり、その逆ではなく、持っている質問IOneITwo実装する質問の両方に答える可能性があるようです。IOneOrTwo

interface IOneOrTwo { }
interface IOne: IOneOrTwo { }
interface ITwo: IOneOrTwo { }

//*** This should now work fine ***
public static IOneOrTwo Foo (this IOne obj, string arg)
{
    // do something with arg
    return obj;     
}

説明:

//This extension method is available to IOne, ITwo, and IOneOrTwo
public static IOneOrTwo Foo2 (this IOneOrTwo obj, string arg)
{
    // do something with arg
    return obj:
}

//This extension method is available only to IOne
public static IOne Foo2 (this IOne obj, string arg)
{
    // do something with arg
    return obj:
}

//This extension method is available only to ITwo
public static ITwo Foo2 (this ITwo obj, string arg)
{
    // do something with arg
    return obj:
}
于 2013-07-24T18:15:53.067 に答える