命名空间范围的泛型类型的别名,在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>>>
。
这将是巨大的,如果我可以创建类型命名空间范围的类型别名泛型类型在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:见净莲评论的,他认为,结构类型也可能会解决这个问题
解决方案
您是幸运的了; using指令只影响其当前的文件。没有命名空间宽型走样机制。
这是一个相当频繁请求的功能,这是点它。但是,这也是一个“最好有”的便利功能,而不是一个真正增加了许多表现力的的语言,这是个反对。这将是很好的事,但它不是真正的高优先级列表上。
其他提示
如果你这样做......
var results = source.Select((x, i) => foo.Bar(x, i));
它可以计算出类型为你而无需显式指定它们。
(诚然这更是一个的变通比溶液)
不隶属于 StackOverflow