我正在创建一个匿名方法来生成一个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();
任何人都可以纠正我吗?
答案 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
变量之间消除歧义,编译器会抛出错误以使您指定哪个变量指的是。