Давайте следующий пример:пространство имен области видимости псевдонимы для универсальных типов в 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
}
Компилятор говорит:
Аргументы типа для метода «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? Или нет веской причины, это просто вопрос денег и/или времени?
EDIT: Я знаю, что могу использовать using
, но это не пространство имен в области - не очень удобно для моего дела.
EDIT2: См. comment by Joren, где он предполагает, что структурная типизация также может решить проблему.
Я не уверен, что проблема с 'использованием' - предоставлена она не определяет новый тип, но не то, что вы хотите? –
Как я уже писал, это пространство имен не ограничено, а скорее скопировано в область. Мне нужно использовать псевдоним через cs-файлы и сборки. –