7

次の例を見てみましょう。

public class X { }
public class Y { }
public class Z { }

public delegate IDictionary<Y, IList<Z>> Bar(IList<X> x, int i);

public interface IFoo
{
    // ...
    Bar Bar { get; }
}

public class Foo : IFoo
{
    // ...
    public Bar Bar
    {
        get
        {
            return null; //...
        }
    }
}

void Main()
{
    IFoo foo; //= ...
    IEnumerable<IList<X>> source; //= ...
    var results = source.Select(foo.Bar); // <- compile error here
}

コンパイラは次のように述べています。

メソッド 'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

に変換できないBarからFunc<IList<X>, int, IDictionary<Y, IList<Z>>>です。

C# でジェネリック型の型名前空間スコープの型エイリアスを作成できれば素晴らしいと思います。次にBar、デリゲートとして定義するのではなく、 の名前空間スコープのエイリアスとして定義しますFunc<IList<X>, int, IDictionary<Y, IList<Z>>>

public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;

次に、たとえばの名前空間スコープのエイリアスを定義することもできますIDictionary<Y, IList<Z>>

適切に使用すれば:)、コードが読みやすくなります。ここで、ジェネリック型をインライン化する必要があり、実際のコードはよく読めません:(

同じ問題を見つけましたか :)? C# 3.0 にない正当な理由はありますか? それとも、正当な理由はなく、単にお金や時間の問題ですか?

編集: を使用できることはわかってusingいますが、名前空間スコープではありません。私の場合はあまり便利ではありません。

EDIT2 : Jorenのコメントを参照してください。構造型付けでも問題が解決する可能性があることが示唆されています。

4

2 に答える 2

9

あなたは運が悪いです。using ディレクティブは、現在のファイルのみに影響します。名前空間全体の型エイリアシング メカニズムはありません。

これはかなり頻繁に要求される機能であり、ポイントです。しかし、それは、言語に多くの表現力を実際に追加するものとは対照的に、「あると便利な」便利な機能でもあり、それはそれに対するポイントです. できればいいのですが、優先度の高いリストではありません。

于 2010-04-07T15:18:40.577 に答える
0

もしあなたがそうするなら ...

var results = source.Select((x, i) => foo.Bar(x, i));

明示的に指定しなくても、型を把握できます。

(確かに、これは解決策というよりは回避策です)

于 2010-04-07T08:11:38.293 に答える