我有代表
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 在初始化之前为空(在使用+ =运算符之前)
答案 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;
:
=