在匿名方法中命名参数

时间:2016-01-11 14:02:04

标签: c#

我正在创建一个匿名方法来生成一个radom字符串。

在声明方法之前,我没有声明任何名为id的参数。 但我仍然无法在方法中定义string id = string.Empty;

// No parameter within name `id` here...

Func<Task<string>> getIdAsync = null;
getIdAsync = async () =>
{
   // string id = string.Empty; // error here. try to use `_id` instead of `id`
   string _id = string.Empty;

   // logic...

   return _id;
};

// _id = ""; // we cann't re-use `_id` here, but `_id` can use `id` below

// `id` is declared after the method
string id = await getIdAsync();

也许我误解了但是我认为它应该在我(仅在这种情况下)时出现错误:

// declare `id` before
string id = string.Empty;

Func<Task<string>> getIdAsync = null;
getIdAsync = async () =>
{
   /*
    * A local or parameter named 'id' cannot be declared in this scope 
    * because that name is used in an enclosing local scope to define a local or parameter
    */
   string id = string.Empty;

   // logic...       
};

id = await getIdAsync();

任何人都可以纠正我吗?

3 个答案:

答案 0 :(得分:3)

这是正确的。

您正在尝试重新声明变量id

解决方案取决于您要做的事情。如果要设置id,只需删除类型定义;

getIdAsync = async () =>
{
   id = string.Empty;

   // logic...       
};

然而,这不是一个好习惯,因为id可能会被异步方法之外的代码所覆盖 - 除非你真的想要这个。如果这只是匿名方法范围的本地变量,则重命名它:

getIdAsync = async () =>
{
   string localId = string.Empty;

   // logic...       
};

就像在if语句或循环中声明一个同名对象一样。

答案 1 :(得分:1)

编译器不关心你的委托方法声明你的局部变量的顺序,因为它不知道你何时会使用你的委托。因此,无论您在代表声明之前或之后是否有此声明,您仍然会发生冲突:

string id = await getIdAsync();

答案 2 :(得分:1)

它与this question类似,虽然这个问题是处理嵌套范围而不是匿名函数,但推理是相同的。

id的范围是整个功能,而不仅仅是声明后的代码。由于无法在“外部”id变量和匿名函数本地的id变量之间消除歧义,编译器会抛出错误以使您指定哪个变量指的是。