在尝试从匿名函数转换为方法组时,我偶然发现了一个奇怪的问题。下面的示例完美地说明了这个问题 - 有 2 种方法 - Run() 和 Crash(),除了使用匿名函数与方法组之外,它们所做的一切都是一样的。
基本上问题是我想创建一个 Func 来调用对象上的方法,该方法在应用程序启动时未初始化,而是稍后出现,在此 func 运行之前。使用匿名函数效果很好,但转换为方法组会导致异常。
坚持使用匿名函数而不是方法组并不是什么大问题,但是出现了一个 roslynator 警告 RCS1207,我想先了解这个问题的原因,然后再用内联注释禁用它。
namespace AnonymousFunctionVsmethodGroup
{
class Program
{
static void Main(string[] args)
{
var app = new App();
app.Run();
app.Crash();
}
}
public class App
{
private Func<string> m_Func;
public void Run()
{
Entity cat = null;
// Anonymous function. At this point cat is null
m_Func = () => cat.GetName();
// Initializing new cat
cat = new Entity("Cat");
// Func is executed on a valid cat
Console.WriteLine(m_Func());
Console.Read();
}
public void Crash()
{
Entity cat = null;
// Method group. At this point cat is null. Code never gets through here and an exception is thrown instead.
// "Delegate to an instance method cannot have null this"
m_Func = cat.GetName;
// Initializing new cat
cat = new Entity("Cat");
// Func is executed on a valid cat?
Console.WriteLine(m_Func());
Console.Read();
}
}
// Sample entity
public class Entity
{
private string name;
public Entity(string name)
{
this.name = name;
}
public string GetName()
{
return name;
}
}
}