0

呼び出し先メソッドで割り当てられているにもかかわらず、メソッドパラメーター IEnumerable が null を返す理由を教えてください。インターフェイスが参照型であることは誰もが知っています。

ロジックを考慮しないでください。シナリオに合わせてビジネスロジックを置き換えました

static void Main()  
{   
  IEnumerable<int> gEnumerable = null;  
  Foo(gEnumerable);    //here param gEnumerable always returns null even if i assign  value at my Foo(), why is it so???  
}    

static IEnumerable<int> Bar(List<int> lst)         
{  
  return lst.Select(k => k);  
}  

private  static  void Foo(IEnumerable<int> response)  
{  
  response = Bar(new List<int> { 1, 2, 3, 4, 5, 6 });  
}

これについて親切に説明してください

4

3 に答える 3

4

インターフェイスが参照型であることは誰もが知っています。

C# で引数がどのように渡されるかについて少し勉強する必要があります。 すべてが値渡しされます (デフォルト)。参照型の場合、参照は関数に渡されるときにコピーされます (参照はその値であるため)。したがって、参照のコピーに新しい値を割り当てていますが、呼び出し元には表示されません。

まったく新しい値を参照に割り当てる必要がある場合は、refまたはout指定子を使用する必要があります。メソッドが入力に新しい値を割り当てることが保証されている場合は、 を使用しますout

于 2012-08-11T20:40:19.373 に答える
3

参照渡しresponseする必要があります。そうしないと、渡された元の参照が変更されません。回避できる場合は、このアプローチを避ける必要があります。

static void Main()  
{   
  IEnumerable<int> gEnumerable = null;  
  Foo(ref gEnumerable);    
} 
private  static void Foo(ref IEnumerable<int> response)  
{  
   response = Bar(new List<int> { 1, 2, 3, 4, 5, 6 });  
}

再設計して、必要な値を返すようにしないのはなぜFooですか? それはずっときれいです。

private  static IEnumerable<int> Foo()  
{  
   return Bar(new List<int> { 1, 2, 3, 4, 5, 6 });  
}
于 2012-08-11T20:40:02.657 に答える
2

Ref キーワードを使用して引数を渡す必要があるため、スコープを離れるとすぐに破棄される新しい列挙を作成する代わりに gEnumerable を変更します。

static void Main()  
{   
  IEnumerable<int> gEnumerable = null;  
  Foo(ref gEnumerable);    //here param gEnumerable always returns null even if i assign       value at my Foo(), why is it so???  
}    

static IEnumerable`<int>` Bar(List`<int>` lst)         
{  
   return lst.Select(k => k);  
}  

private  static  void Foo(ref IEnumerable`<int>` response)  
{  
  response = Bar(new List`<int>` { 1, 2, 3, 4, 5, 6 });  
}
于 2012-08-11T20:41:37.507 に答える