受Phil Haack's attempt on null or empty coalescing的启发,我试图为string
对象以及IEnumerable<T>
接口编写几个扩展方法来简化无效或无效的ckecking。然而,我遇到了一些问题:当我试图调用AsNullIsEmpty
的版本时,编译器将我的字符串视为IEnumerable<char>
,当然会给出错误的返回类型。对C#泛型的反约束
有没有什么办法对的IEnumerable
版本的定义把“反限制”,这样我可以告诉编译器使用一个每当T
类型是不string
?像
public static IEnumerable<T> AsNullIfEmpty(this IEnumerable<T> items)
where T !: string
东西,我知道我可以只改变其中一人的名字,但我想有一致性相同的名称。
更新:原来我的问题与扩展方法解决了另一种方式,通过固定的简单和愚蠢的错误(我用的是str.IsNullOrEmpty()
,在IEnumerable<T>
扩展方法,而不是string.IsNullOrEmpty(str)
...),但由于对泛型的反约束问题仍然是一个有趣的问题,我不会删除它。
编译器将采取最具体的可用方法。如果你实现了一个字符串,并确保它可以在Call站点使用,那么就不会有像描述的那样的问题 – 2010-07-15 12:28:38