名前空間は、C#でジェネリック型のエイリアスをスコープ
-
25-09-2019 - |
質問
レッツは、次の例があります:
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>>>
を変換することはできません、ためです。
それは素晴らしいことです。その後、私はない委譲として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によってコメントを参照してください。
解決
あなたは運の外出します。 usingディレクティブは、現在のファイルに影響を与えます。名前空間全体のタイプエイリアシングのメカニズムはありません。
これはそれのためのポイントである、かなり頻繁に要求された機能です。しかし、実際にそれに対してポイントである言語に表現力の多くを追加し1とは対照的に、便利な機能「を持っていい」もあります。やっていいだろうが、それは優先順位リスト上の本当に高いではありません。
他のヒント
これを行うと...
var results = source.Select((x, i) => foo.Bar(x, i));
それが明示的に指定しなくても、あなたのためのタイプを把握することができます。
(確かにこれはより多くの回避策のソリューションよりも)