params przeciąża pozorną niejednoznaczność - wciąż się kompiluje i działa?

Właśnie znaleźliśmy je w naszym kodzie:

public static class ObjectContextExtensions
{

    public static T Find<T>(this ObjectSet<T> set, int id, params Expression<Func<T, object>>[] includes) where T : class
    {
        ...
    }

    public static T Find<T>(this ObjectSet<T> set, int id, params string[] includes) where T : class
    {
       ...
    }
}

Jak widać, mają one ten sam podpis, z wyjątkiem podpisuparams.

I są używane na kilka sposobów, jeden z nich:

DBContext.Users.Find(userid.Value); //userid being an int? (Nullable<int>)

który, co dziwne dla mnie, ustala pierwsze przeciążenie.

P1: Dlaczego nie powoduje to błędu kompilacji?

P2: Dlaczego kompilator C # rozwiązuje powyższe wywołanie do pierwszej metody?

Edytować: Aby wyjaśnić, jest to C # 4.0, .Net 4.0, Visual Studio 2010.

questionAnswers(3)

yourAnswerToTheQuestion