以下是几个课程:
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'或“”(空字符串)吗?
非常感谢!
答案 0 :(得分:2)
q1:您只传入字符串,因此它将使用字符串[]版本
q2:除了matt所说的,即使Concat允许空值,你仍然会从你调用Price.ToString()的地方得到例外,因为Price为空
答案 1 :(得分:1)
我想,调用'Object []'的重载(因为使用了不同类型的参数)(如果我错了,请纠正我)。
如果Price为null,Price.ToString()会导致错误。并且此处不需要.ToString()
答案 2 :(得分:1)
最合适的重载 - 如果所有参数都是字符串,则将调用字符串重载。由于它们不是,因此将调用Object
重载。
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
- 子句或类似术语可以避免使用它们。
并回答你的问题:
string[]
重载。Concat
会将null
视为空字符串。