委托+ =运算符类范围与本地范围

时间:2017-01-26 08:09:19

标签: c# .net delegates

我有代表

delegate void Del(int a, int b);

为什么这段代码有效:

class MyClass
{
    private Del invoker;

    public void SetInvoker(Del del)
    {
        invoker += del; //everything is ok
    }
}

虽然这段代码没有?

 public class Program
    {
        static void Main(string[] args)
        {
           Del invoker += new Del(Display); //error! Invalid expression term '+='

        }

        static void Display(int a, int b)
        {

        }
    }

这很奇怪,因为在两种情况下 invoker 在初始化之前为空(在使用+ =运算符之前)

3 个答案:

答案 0 :(得分:3)

这一行

Del invoker += new Del(Display);

等于

Del invoker;
invoker = invoker + new Del(Display);

调用者无法在+运算符中使用,因为它未初始化。

所以

在Main方法中,invoker是一个局部变量,每个局部变量必须在使用前初始化。 invoker的值不是null,但不是初始化。如果您没有为变量指定任何值,它会向您抛出error,表示它未初始化。因此,您需要明确指定null

public class Program
{
    static void Main(string[] args)
    {
       Del invoker = null;
       invoker += new Del(Display); //error!
    }

    static void Display(int a, int b)
    {

    }
}

当您使用class版本时,class'es constructor会首先使用默认值初始化字段。因此,在创建对象之后,它的所有字段都具有默认值,因此您可以使用+=

答案 1 :(得分:1)

错误代码中,invoker本地可修改

   static void Main(string[] args)
   {
       Del invoker += new Del(Display); //error!

未启动因此包含垃圾箱。你是 试图将Display加到垃圾堆中,所以这是一个错误。

您必须初始化 invoker,您可以通过各种方式进行操作:

   // Fields are initialized by default value; that's why invoker == null
   private static Del invoker;

   static void Main(string[] args)
   {
       invoker += new Del(Display);

或者

   static void Main(string[] args)
   {
       // just an assignment - notice = instead of +=
       Del invoker = new Del(Display); 

或者

   static void Main(string[] args)
   {
       Del invoker = null;
       invoker += new Del(Display);

答案 2 :(得分:1)

FirebaseService.service.createFirebaseUser(uid: (user?.uid)!, userData: picUser.toDictionary()) // creates firebase user with userData weakSelf?.performSegue(withIdentifier: SEGUES.HOME_SCREEN_TO_TAB_HOME, sender: nil) // go to the next screen 就像任何其他运营商一样。如果左操作数和右操作数具有正确的类型,则编译它。

在第一种情况下,您将+=(参数)添加到类(Del)中的变量中。这是有效的,因为类型是正确的。

但在第二种情况下:

invoker

仔细查看您的代码。 Del invoker += new Del(Display); //error! 是变量声明。在变量声明之后只能放置一个运算符,即Del invoker。您的代码无法正常工作,原因与其原因相同:

=

所以请改用int a += 10;

=