using System;
using System.Linq;
using System.Threading;
static class Extensions
{
public static Delegate ConvertTo(this Delegate self, Type type)
{
if (type == null) { throw new ArgumentNullException("type"); }
if (self == null) { return null; }
return Delegate.Combine(
self.GetInvocationList()
.Select(i => Delegate.CreateDelegate(type, i.Target, i.Method))
.ToArray());
}
}
class Program
{
static void Main()
{
Action x = delegate { };
x += new Action(delegate { });
ThreadStart badCopy = new ThreadStart(x);
ThreadStart goodCopy = (ThreadStart)x.ConvertTo(typeof(ThreadStart));
Console.WriteLine("x == badCopy: {0}", x.Equals(badCopy));
Console.WriteLine("x == goodCopy: {0}", x.Equals(goodCopy));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKCnN0YXRpYyBjbGFzcyBFeHRlbnNpb25zCnsKCXB1YmxpYyBzdGF0aWMgRGVsZWdhdGUgQ29udmVydFRvKHRoaXMgRGVsZWdhdGUgc2VsZiwgVHlwZSB0eXBlKQoJewoJCWlmICh0eXBlID09IG51bGwpIHsgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidHlwZSIpOyB9CgkJaWYgKHNlbGYgPT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQoJCQoJCXJldHVybiBEZWxlZ2F0ZS5Db21iaW5lKAoJCQlzZWxmLkdldEludm9jYXRpb25MaXN0KCkKCQkJCS5TZWxlY3QoaSA9PiBEZWxlZ2F0ZS5DcmVhdGVEZWxlZ2F0ZSh0eXBlLCBpLlRhcmdldCwgaS5NZXRob2QpKQoJCQkJLlRvQXJyYXkoKSk7Cgl9Cn0KCmNsYXNzIFByb2dyYW0KewoJc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJQWN0aW9uIHggPSBkZWxlZ2F0ZSB7IH07CgkJeCArPSBuZXcgQWN0aW9uKGRlbGVnYXRlIHsgfSk7CgkJCgkJVGhyZWFkU3RhcnQgYmFkQ29weSA9IG5ldyBUaHJlYWRTdGFydCh4KTsKCQlUaHJlYWRTdGFydCBnb29kQ29weSA9IChUaHJlYWRTdGFydCl4LkNvbnZlcnRUbyh0eXBlb2YoVGhyZWFkU3RhcnQpKTsKCQkKCQlDb25zb2xlLldyaXRlTGluZSgieCA9PSBiYWRDb3B5OiB7MH0iLCB4LkVxdWFscyhiYWRDb3B5KSk7CgkJQ29uc29sZS5Xcml0ZUxpbmUoInggPT0gZ29vZENvcHk6IHswfSIsIHguRXF1YWxzKGdvb2RDb3B5KSk7Cgl9Cn0=