次の例を見てみましょう。
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のコメントを参照してください。構造型付けでも問題が解決する可能性があることが示唆されています。