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

C# 扩展方法中创建的实例为null,c#,extension-methods,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>(); }

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

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 static void AddIfNullCreate(此IDictionary dictionary、TKey、TValue)
{
if(dictionary==null)
{
字典=新字典();
}
添加(键、值);
}
但是当我使用它的时候

    public void DictionaryTest()
    {
        IDictionary<int, string> d = GetD();

        d.AddIfNullCreate(1,"ss");
    }

    private IDictionary<int, string> GetD()
    {
        return null;
    }
public void DictionaryTest()
{
IDictionary d=GetD();
d、 补充(1,“ss”);
}
私有IDictionary GetD()
{
返回null;
}

调用addifynullcreate后,该值为空。为什么会这样?

就像任何其他方法一样,对参数的更改不会更改调用方的参数,除非它是
ref
参数(对于扩展方法第一个参数,它不能是该参数),即使该值是一个引用

一个选项是也返回字典:

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;
}
然而,我不确定我真的会那样做。我想我应该在方法本身中有条件地创建字典:

public void DictionaryTest()
{
    IDictionary<int, string> d = GetD() ?? new Dictionary<int, string>();

    d[1] = "ss";
}
public void DictionaryTest()
{
IDictionary d=GetD()??新字典();
d[1]=“ss”;
}

如果这是一种普通方法,则需要将字典作为ref参数传递,以便正确设置指向新创建对象的内存指针。不过,我认为不允许您将扩展方法的第一个参数指定为ref参数。

Jon在这里,没有什么要添加的,一如既往:)+1
public void DictionaryTest()
{
    IDictionary<int, string> d = GetD() ?? new Dictionary<int, string>();

    d[1] = "ss";
}