我已经创建了这个扩展方法
public static void AddIfNullCreate<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
if (dictionary == null)
{
dictionary = new Dictionary<TKey, TValue>();
}
dictionary.Add(key, value);
}
但是当我使用它时
public void DictionaryTest()
{
IDictionary<int, string> d = GetD();
d.AddIfNullCreate(1,"ss");
}
private IDictionary<int, string> GetD()
{
return null;
}
调用AddIfNullCreate后,d null。为什么会这样?
答案 0 :(得分:8)
就像任何其他方法一样,对参数的更改不会更改调用者的参数,除非它是ref
参数(它不能用于扩展方法的第一个参数)。 The argument is passed by value,即使该值是参考。
一种选择是返回字典:
public static IDictionary<TKey, TValue> AddIfNullCreate<TKey, TValue>
(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
{
if (dictionary == null)
{
dictionary = new Dictionary<TKey, TValue>();
}
dictionary.Add(key, value);
return dictionary;
}
然后:
d = d.AddIfNullCreate(1, "ss");
然而,我不确定我是否真的这样做。我想我只是在方法本身有条件地创建字典:
public void DictionaryTest()
{
IDictionary<int, string> d = GetD() ?? new Dictionary<int, string>();
d[1] = "ss";
}
答案 1 :(得分:3)
如果这是作为普通方法完成的,则需要将字典作为ref参数传递,以便正确设置指向新创建的对象的内存指针。我不认为你可以将扩展方法的第一个参数指定为ref参数。