让我们下面的示例:

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)”不能   从使用推断。尝试   指定类型参数   明确。

这是因为,它不能转换BarFunc<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));

它可以计算出类型为你而无需显式指定它们。

(诚然这更是一个的变通比溶液)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top