无法创建新的MatchCollection - 没有定义构造函数

时间:2013-04-02 02:14:32

标签: c#

所以,也许我累了,但为什么我不能创建一个新的MatchCollection

我有一个通过调用MatchCollection返回regex.Matches的方法:

public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
    Regex regex = new Regex(@"\$\(.+?\)");

    return regex.Matches(sourceString);
}

如果参数为null,我想要做的是返回一个空集合:

public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
    if (sourceString == null)
    {
        return new MatchCollection();
    }

    Regex regex = new Regex(@"\$\(.+?\)");

    return regex.Matches(sourceString);
}

但由于这一行而无法编译:

return new MatchCollection();

错误:

  

类型'System.Text.RegularExpressions.MatchCollection'没有   构造函数定义。

一个类型如何定义没有构造函数?我认为如果没有显式定义构造函数,将创建默认构造函数。是否无法为我的方法返回创建MatchCollection的新实例?

3 个答案:

答案 0 :(得分:6)

非常恰当地使用Null Object模式!

像这样实施:

public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
    Regex regex = new Regex(@"\$\(.+?\)");

    return regex.Matches(sourceString ?? String.Empty);
}

答案 1 :(得分:3)

  

如何定义类型没有构造函数?

它不能。但是它可以通过使它们非公开 - 即私有,内部或受保护来隐藏它的所有构造函数。此外,一旦定义了构造函数,默认构造函数就变得不可访问。同一名称空间中的其他类可以访问内部构造函数,但名称空间外部的类将无法直接实例化类。

P.S。如果你想创建一个空的匹配集合,你总是可以创建一个匹配某个东西的表达式,并将其传递给其他东西:

Regex regex = new Regex(@"foo");
var empty = regex.Matches("bar"); // "foo" does not match "bar"

答案 2 :(得分:1)

也许是一种解决方法:

如果sourceStringnull,请将其设置为""并继续执行。