任何人都可以告诉我为什么方法参数IEnumerable返回null,即使它是在callee方法中分配的。 我们都知道interface是一个引用类型。
不要考虑逻辑。我刚刚更换了我的业务逻辑以适应场景
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 });
}
请向我解释一下这个
答案 0 :(得分:4)
我们都知道interface是一种引用类型。
你需要研究一下如何在C#中传递参数。 Everything 按值传递(默认情况下)。在引用类型的情况下,传递给函数时引用复制(因为引用是其值)。因此,您要为引用的副本分配新值,并且调用者不会看到它。
如果您确实需要为引用分配全新值,则必须使用ref
或out
说明符。如果您的方法保证它将为其输入分配新值,则使用out
。
答案 1 :(得分: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
返回您想要的值?那是更清洁的imo。
private static IEnumerable<int> Foo()
{
return Bar(new List<int> { 1, 2, 3, 4, 5, 6 });
}
答案 2 :(得分: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 });
}