是什么原因导致string.concat中的异常

时间:2011-01-03 16:45:00

标签: .net string concatenation string-concatenation

以下是几个课程:

public class MyItem : ParamOut
{
    public string Code
    {
        get { return _quoteCode; }
    }

    public InnerItem[] Skus
    {
        get { return _skus; }
    }

    public PriceSummary Price
    {
        get { return _price; }
    }

    public override string ToString()
    {
        return string.Concat("Code=", Code, "; SKUs=[", Skus != null ? "{" + string.Join("},{", Array.ConvertAll(Skus, item => item.ToString())) + "}" : "", "]"
            , "; Price={", Price.ToString(), "}", base.ToString()
            );
    }

    ...
}

public abstract class ParamOut
{
    public override string ToString()
    {
        return null;
    }

    public string ErrorMessage { get; set; }
}

这是呼叫功能:

{
    MyItem item = new MyItem{ ErrorMessage = "Bla-bla-bla" };
    string text = item.ToString();
}

我在'ToString()'方法中得到NullReference异常(item变量的每个属性都为null)。

问题:

Q1。在这种情况下会调用string.Concat的什么重载?我有9个参数,所以我想其中一个:

public static string Concat(params Object[] args)

public static string Concat(params string[] values)

但是他们中的哪一个?

Q2。为什么会生成异常?不应该将'null'转换为'null'或“”(空字符串)吗?

非常感谢!

6 个答案:

答案 0 :(得分:2)

q1:您只传入字符串,因此它将使用字符串[]版本

q2:除了matt所说的,即使Concat允许空值,你仍然会从你调用Price.ToString()的地方得到例外,因为Price为空

答案 1 :(得分:1)

  1. 我想,调用'Object []'的重载(因为使用了不同类型的参数)(如果我错了,请纠正我)。

  2. 如果Price为null,Price.ToString()会导致错误。并且此处不需要.ToString()

答案 2 :(得分:1)

  1. 最合适的重载 - 如果所有参数都是字符串,则将调用字符串重载。由于它们不是,因此将调用Object重载。

  2. Price可能为null或其中一个SKU项,甚至可能是Code,因此请在ToString上调用Concat(将对象传递给{{} 1}}将调用ToString)将抛出NullReferenceException。

答案 3 :(得分:0)

  

不应该'null'转换成   类似'null'或“”(空   字符串)?

它应该转换成什么?有些人想要空字符串,其他人想要“null”等等。微软决定不回答这个问题,因为这里有很多东西可以作为有效答案。所以MS采取了更安全的路线,只是抛出异常。

答案 4 :(得分:0)

首先,我怀疑你的NullReferenceException是因为你在空对象上调用ToString

但是,尝试连接null也会给你一个例外。

在这种情况下,您可能更喜欢使用string.Format

return string.Format("Code={0}; SKUs=[{1}]; Price={2}{3}", 
    Code ?? "null",
    SKUs != null ? 
        string.Join(",", SKUs.Select(s => "{" + s.ToString() ?? "null" + "}")) :
        string.Empty,
    (Price ?? "null").ToString() ?? "null",
    base.ToString() ?? "null");

您可以在任何可能处理空值的地方看到使用null-coalescing运算符(??)。

x.ToString() ?? "null"

在逻辑上等同于

x.ToString() == null ? "null" : x.ToString()

我有多少空检查已经超过了顶部,但看起来你所拥有的代码中有很多潜在的陷阱。 :)

答案 5 :(得分:0)

我想你是自己说的:

  

(item变量的每个属性为null)

您应该检查InnerItem的数组(来自Skus属性)是否包含任何null元素。

使用简单的Where - 子句或类似术语可以避免使用它们。

并回答你的问题:

  • Q1:将调用string[]重载。
  • Q2:Concat会将null视为空字符串。