LinqPadless icon indicating copy to clipboard operation
LinqPadless copied to clipboard

Support Main in a class, outside or under a namespace

Open atifaziz opened this issue 6 years ago • 0 comments

It seems that #29 has more ramifications with respect to entry-point Main.

If Main is in a class in a namespace:

public static void Print(MethodBase method) =>
    Console.WriteLine($"{method.DeclaringType.FullName}::{method.Name}");

namespace MyApp1
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}

It gets called:

MyApp1.Program::Main

If there are two Main:

public static void Print(MethodBase method) =>
    Console.WriteLine($"{method.DeclaringType.FullName}::{method.Name}");

namespace MyApp1
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}
namespace MyApp2
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}

then the latter of the two is called:

MyApp2.Program::Main

If there is also a Main at root, however:

public static void Print(MethodBase method) =>
    Console.WriteLine($"{method.DeclaringType.FullName}::{method.Name}");

public static void Main(string[] args) =>
    Print(MethodBase.GetCurrentMethod());

namespace MyApp1
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}
namespace MyApp2
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}

then it is called instead:

UserQuery::Main

If there is a Main in a class without a namespace:

public static void Print(MethodBase method) =>
    Console.WriteLine($"{method.DeclaringType.FullName}::{method.Name}");

static class Program
{
    static void Main(string[] args) =>
        Print(MethodBase.GetCurrentMethod());
}

namespace MyApp1
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}
namespace MyApp2
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}

then it is called and trumps the other two:

UserQuery+Program::Main

Finally, a Main outside a class and a namespace:

public static void Print(MethodBase method) =>
    Console.WriteLine($"{method.DeclaringType.FullName}::{method.Name}");

public static void Main(string[] args) =>
    Print(MethodBase.GetCurrentMethod());

static class Program
{
    static void Main(string[] args) =>
        Print(MethodBase.GetCurrentMethod());
}

namespace MyApp1
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}
namespace MyApp2
{
    static class Program
    {
        static void Main(string[] args) =>
            Print(MethodBase.GetCurrentMethod());
    }
}

then it trumps all:

UserQuery+Program::Main

/cc @albahari

atifaziz avatar Sep 20 '19 09:09 atifaziz