我们可以使用两个同名的Func吗?编译器不会抛出任何错误

问题描述 投票:1回答:2

在下面的代码中,我在一个具有相同名称且都相同的方法中创建了2个Funcs 1)Class级别和2)。当我构建解决方案时,它不会抛出任何错误,并且执行得很好。现在,我有兴趣调用类成员的Func,但是我没有找到方法。有人可以帮我吗。

public class TaskDemo
{
    public int NumberStrat { get; set; }
    public int NumberEnd { get; set; }

    Func<int, string> isNumerEvenOdd = (i) =>
    {
        return i.ToString();
    };

    public void print()
    {

        List<int> NumbersList = new List<int>();
        for (int i = 0; i < 1000; i++)
        {
            NumbersList.Add(i);
        }

        Func<int, string> isNumerEvenOdd = (i) =>
        {
            return "abc";
        };

        Parallel.ForEach(NumbersList, (i) => Console.WriteLine(isNumerEvenOdd(i)));

    }
}
c# delegates action predicate func
2个回答
0
投票

使用this关键字。

Parallel.ForEach(NumbersList, (i) => Console.WriteLine(this.isNumerEvenOdd(i)));

示例-> https://onlinegdb.com/SkRpXyCRH

有关更多信息-> https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/this


1
投票

实际上,至少在Resharper中,有一个警告,即您本地声明的Func<int, string> isNumerEvenOdd隐藏了在类级别声明的Func<int, string> isNumerEvenOdd,并且从未使用过。因此,本地成员只需隐藏类成员即可正常工作。

之所以没有编译器错误,是因为您在不同的范围(类和方法)中用相同的名称定义了变量。当您尝试在相同作用域中使用相同名称定义变量时,编译器显示错误。

实际使用this会为您解决在Parallel.ForEach(NumbersList, (i) => Console.WriteLine(this.isNumerEvenOdd(i)));上的问题,如先前的答案所述,因为在这种情况下,您所引用的字段是在类范围而不是方法范围内定义的。

this关键字引用该类的当前实例

© www.soinside.com 2019 - 2024. All rights reserved.