μλ νμΈμ.
μ¬λ¬λΆλ€μ target-typed new expressionsλ₯Ό λ§μ΄ μ¬μ©νμλμ?
μ λ μ ννμ μκ³ λμλΆν° var λμ μ£Όλ‘ μ¬μ©νκ³ μμ΅λλ€.
μ΅κ·Ό delegate chain μν μ½λλ₯Ό μμ±νλ€κ° μ»΄νμΌμ΄ λμ§ μλ μν©μ κ²ͺμ΄ κ³΅μ νκ³ μ ν©λλ€.
νκ²½μ visual studio 2022, .NET6 μ λλ€.
μ»΄νμΌ νκΈ° μ κΉμ§ μ΄λ ꡬ문μμ μλ¬κ° λ°μνλμ§ νμκ° μλκ³ λ°λ‘ λ¬Έμ κ° μλ λΆλΆμ΄ μλ μ½λμΈ κ² κ°μ§λ§ μ€λ₯ CS7038 λͺ¨λ 'ConsoleApp'μ(λ₯Ό) λ΄λ³΄λ΄μ§ λͺ»νμ΅λλ€. μ€λ₯μ νΉμ μμΈμ νμΈν μ μμ΅λλ€.
κ° λ°μνλ©΄μ μ νν μμΈμ νμ
ν μ μλλΌκ³ μ.
sharplabμμλ κ°μ μλ¬κ° λ°μν©λλ€.
κ·Έλλ§ λ¬Έμ κ° λ κ² κ°μ λΆλΆμ΄ 12λ² λΌμΈμ΄λΌ μ΄κ²μ κ² ν μ€νΈν΄λ³Έ κ²°κ³Ό += μ°μ°μΌ λ target-typed new expressionsκ° λμμ μνλ κ² κ°μ΅λλ€.
void FooOne()
{
Console.WriteLine("Foo One!!");
}
void FooTwo()
{
Console.WriteLine("Foo Two!!");
}
// success
// FooDelegate fooDelegate = FooOne;
// fooDelegate += FooTwo;
// success
// FooDelegate fooDelegate = new FooDelegate(FooOne);
// fooDelegate += new FooDelegate(FooTwo);
// error
FooDelegate fooDelegate = new (FooOne);
fooDelegate += new (FooTwo);
fooDelegate.Invoke();
delegate void FooDelegate();
μ»΄νμΌμ΄ μ±κ³΅νλ λ ννμ sharplapμμ μ»΄νμΌλ κ²°κ³Όλ₯Ό 보면
public void Print()
{
FooDelegate a = new FooDelegate(FooOne);
a = (FooDelegate)Delegate.Combine(a, new FooDelegate(FooTwo));
FooDelegate a2 = new FooDelegate(FooOne);
a2 = (FooDelegate)Delegate.Combine(a2, new FooDelegate(FooTwo));
}
+= μ°μ°μ΄ Delegate.CombineμΌλ‘ μΉνλλ λͺ¨μ΅μ νμΈν΄ λ³Ό μ μμμ΅λλ€.
νμ§λ§ target-typed new expressionsλ₯Ό μ¬μ©νλ©΄ μλλ κ²μΌλ‘ 보μ Delegate.Combine λ©μλμ λ§€κ°λ³μκ° Delegate μΆμνμ μ΄λΌ νμ μ μ μΆν μ μμ΄μ κ·Έλ°κ° μΆκΈ°λ νκ³ β¦ μ νν μμΈμ λͺ°λΌμ roslynμ github issueλ‘ λ±λ‘μ νμ΅λλ€.
κ΄λ ¨ κ°λ°μλΆλ€μ΄ λκΈμ λ¬μμ£Όμ ¨λλ° target-typed new expressionsμ λμ μ°μ°μ(=)μμλ§ μ¬μ©μ΄ κ°λ₯νλ€κ³ νμ§λ§ eventλ +=κ° μ²λ¦¬κ° λλ€κ³ νλ€μ.
μΆκ°μ μΌλ‘ switchλ¬Έμ μ¬μ©νλ©΄ μλ¬κ° λ°μνμ§ μλλ€κ³ νλλ°β¦ νμΈν΄λ³΄λ μ λ§ μλ¬κ° λ°μνμ§λ μμ΅λλ€.
- event μ¬μ©
Foo foo = new();
foo.FooEvent += FooOne;
foo.FooEvent += new(FooTwo); // νν κ°λ₯!
foo.Print();
void FooOne()
{
Console.WriteLine("FooOne!");
}
void FooTwo()
{
Console.WriteLine("FooTwo!");
}
class Foo
{
public delegate void FooDelegate();
public event FooDelegate FooEvent;
public void Print() => FooEvent.Invoke();
}
---> sharplab μ»΄νμΌ
Foo foo = new Foo();
foo.FooEvent += new Foo.FooDelegate(FooOne);
foo.FooEvent += new Foo.FooDelegate(FooTwo);
- switch μ μ¬μ©
void FooOne()
{
Console.WriteLine("Foo One!!");
}
void FooTwo()
{
Console.WriteLine("Foo Two!!");
}
string type = "two";
FooDelegate fooDelegate = new(FooOne);
fooDelegate += type switch // νν κ°λ₯!
{
"one" => new(FooOne),
"two" => new(FooTwo),
_ => throw new ArgumentException(),
};
fooDelegate.Invoke();
delegate void FooDelegate();
---> sharplab μ»΄νμΌ
string text = "two";
FooDelegate fooDelegate = new FooDelegate(FooOne);
FooDelegate a = fooDelegate;
FooDelegate b;
if (!(text == "one"))
{
if (!(text == "two"))
{
throw new ArgumentException();
}
b = new FooDelegate(FooTwo);
}
else
{
b = new FooDelegate(FooOne);
}
fooDelegate = (FooDelegate)Delegate.Combine(a, b);
fooDelegate();
eventκ° μ΄λ―Έ μ²λ¦¬λκ³ μλ―μ΄ delegateλ μ»΄νμΌμ΄ κ°λ₯ν΄μΌ λ κ² κ°λ€κ³€ νλλ°, μ μ΄μκ° μ²λ¦¬κ° λ μ§λ λͺ¨λ₯΄κ² λ€μ.
νμ¬ μν©μΌλ‘μλ delegate chain μ¬μ© μ target-typed new expressions ννμ μ£Όμκ° νμν΄ λ³΄μ λλ€.