Rzućmy następujący przykład:nazw scoped aliasy typów generycznych w języku C#
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
}
Kompilator mówi:
Argumenty typu dla metody „System.Linq.Enumerable.Select (Systemu .Collections.Generic.IEnumerable, System.Func) "nie można wywnioskować z użycia za pomocą . Spróbuj jednoznacznie określić argumenty typu .
To dlatego, że nie można przekonwertować Bar
na Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
Byłoby świetnie, gdybym mógł utworzyć aliasy typu o typie przestrzeni nazw dla typów ogólnych w języku C#. Wtedy zdefiniowałbym nie jako delegata, ale raczej zdefiniowałbym go jako alias o przestrzeni nazw o nazwie Func<IList<X>, int, IDictionary<Y, IList<Z>>>
.
public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;
Mogłabym również zdefiniować alias o zasięgu nazw, np. IDictionary<Y, IList<Z>>
.
A jeśli użyje się go odpowiednio :), sprawi, że kod będzie bardziej czytelny. Teraz muszę wpisać typy ogólne i prawdziwy kod nie jest dobrze czytelny :(
Czy znalazłeś ten sam problem :)? Czy jest jakiś dobry powód, dla którego nie jest w C# 3.0? Lub nie ma dobrego powodu, to tylko kwestia pieniędzy i/lub czasu?
EDYCJA: Wiem, że mogę używać using
, ale to nie jest obszar nazw o zasięgu - nie jest to tak wygodne dla mojego przypadku.
EDIT2: Zobacz, comment by Joren, gdzie sugeruje, że pisanie strukturalne może również rozwiązać problem.
Nie jestem pewien, jaki jest problem z 'using' - czy nie definiuje nowego typu, ale czy nie tego właśnie chcesz? –
Tak jak napisałem, nie jest to obszar nazw, ale zakres plików. Potrzebuję użyć aliasu dla plików i złożeń cs. –