【发布时间】:2011-02-05 03:31:27
【问题描述】:
让我们举个例子:
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:参见comment by Joren,他建议结构类型也可以解决问题。
【问题讨论】:
-
我不确定
using的问题是什么——尽管它没有定义新类型,但这不是你想要的吗? -
正如我所写的,它不是命名空间范围的,而是文件范围的。我需要跨 cs 文件和程序集使用别名。
标签: c# generics delegates alias structural-typing