【问题标题】:Namespace scoped aliases for generic types in C#C# 中泛型类型的命名空间范围别名
【发布时间】: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&lt;IList&lt;X&gt;, int, IDictionary&lt;Y, IList&lt;Z&gt;&gt;&gt;

如果我可以在 C# 中为泛型类型创建类型命名空间范围的类型别名,那就太好了。然后我会将Bar 定义为不是委托,而是将其定义为Func&lt;IList&lt;X&gt;, int, IDictionary&lt;Y, IList&lt;Z&gt;&gt;&gt; 的命名空间范围别名。

public alias Bar = Func<IList<X>, int, IDictionary<Y, IList<Z>>>;

然后我还可以定义命名空间范围的别名,例如IDictionary&lt;Y, IList&lt;Z&gt;&gt;.

如果使用得当:),它将使代码更具可读性。现在,我必须内联泛型类型,而真正的代码可读性不好:(

你有没有遇到同样的麻烦:)?有什么好的理由为什么它不在 C# 3.0 中?还是没有充分的理由,只是金钱和/或时间的问题?

编辑:我知道我可以使用 using,但它不是命名空间范围内的 - 对我来说不太方便。

EDIT2:参见comment by Joren,他建议结构类型也可以解决问题。

【问题讨论】:

  • 我不确定using 的问题是什么——尽管它没有定义新类型,但这不是你想要的吗?
  • 正如我所写的,它不是命名空间范围的,而是文件范围的。我需要跨 cs 文件和程序集使用别名。

标签: c# generics delegates alias structural-typing


【解决方案1】:

你运气不好; using 指令仅影响其当前文件。没有名称空间范围的类型别名机制。

这是一个相当频繁请求的功能,这是它的要点。但它也是一个“很高兴拥有”的便利功能,而不是真正为语言增加大量表示能力的功能,这是反对它的观点。这样做很好,但在优先级列表中并不是很高。

【讨论】:

  • 如果我没记错的话,委托上的结构类型也可能允许编译器处理这种特定情况,尽管方式非常不同。是否有合理的机会支持诸如委托之类的结构类型化?
  • @Joren:是的,这可以解决这个问题。我认为大多数人现在意识到,从一开始就对代表进行结构化类型可能会更好,但那艘船已经航行了。现在改变它将是一个相当大的突破性变化。也就是说,人们对结构类型重新产生了兴趣,所以我不想说这种情况没有发生的可能性。
【解决方案2】:

如果你这样做......

var results = source.Select((x, i) => foo.Bar(x, i));

它可以为您找出类型,而无需明确指定它们。

(诚然,这更像是一种变通方法而不是解决方案)

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 2011-08-28
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多