扩展方法中创建的实例为null

时间:2011-08-01 09:19:01

标签: c# extension-methods

我已经创建了这个扩展方法

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。为什么会这样?

2 个答案:

答案 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参数。

相关问题