C#:编译器是否可以自动调用方法?

C#:编译器是否可以自动调用方法?,c#,methods,icomparable,C#,Methods,Icomparable,在这段代码中,不会显式调用CompareTo()方法,max()会给出正确的结果。所以,我的问题是:CompareTo()是否可能被隐式/自动调用?如果是这样,我怎么知道可以隐式调用哪个其他函数/方法?请帮我理解,谢谢! 结果:史蒂夫 public class Student : IComparable<Student> { public int StudentID { get; set; } public string StudentName { get; set

在这段代码中,不会显式调用CompareTo()方法,max()会给出正确的结果。所以,我的问题是:CompareTo()是否可能被隐式/自动调用?如果是这样,我怎么知道可以隐式调用哪个其他函数/方法?请帮我理解,谢谢! 结果:史蒂夫

public class Student : IComparable<Student> 
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int Age { get; set; }
    public int StandardID { get; set; }

    public int CompareTo(Student other)
    {
        if (this.StudentName.Length >= other.StudentName.Length)
        return 1;

        return 0;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Student collection
        IList<Student> studentList = new List<Student>>() { 
                new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
                new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 } ,
                new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
                new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} ,
                new Student() { StudentID = 5, StudentName = "Steve" , Age = 15 } 
            };
        var studentWithLongName = studentList.Max();

        Console.WriteLine("Student Name: {1}", studentWithLongName.StudentName);

    }
}
公共班级学生:i可比
{
公共int StudentID{get;set;}
公共字符串StudentName{get;set;}
公共整数{get;set;}
公共int标准ID{get;set;}
公共国际比较(学生其他)
{
如果(this.StudentName.Length>=other.StudentName.Length)
返回1;
返回0;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
//学生收藏
IList studentList=新列表>(){
new Student(){StudentID=1,StudentName=“John”,年龄=13},
新学生(){StudentID=2,StudentName=“Moin”,年龄=21},
new Student(){StudentID=3,StudentName=“Bill”,年龄=18},
新学生(){StudentID=4,StudentName=“Ram”,年龄=20},
新学生(){StudentID=5,StudentName=“Steve”,年龄=15}
};
var studentWithLongName=studentList.Max();
WriteLine(“学生名:{1}”,studentWithLongName.StudentName);
}
}

正如Jeroen所说,您正在调用
IEnumerable.Max()
方法

基本上,该函数在“阴影中”所做的工作与此类似:

private static T Max(IEnumerable源代码),其中T:IComparable
{
if(source==null)
抛出新ArgumentNullException(nameof(source));
bool-isMaxSet=false;
T最大值;
foreach(源中的T项)
{
如果(isMaxSet==false)
{
最大值=项目;
isMaxSet=true;
}
其他的
{
if(max.CompareTo(item)<0)//在这里使用它!
最大值=项目;
}
}
如果(isMaxSet==false)
抛出新的InvalidOperationException();
返回最大值;
}
另外,要小心,因为
int CompareTo(Student)
函数不完整,使用该函数可能会导致意外结果

如中所述,它的工作原理如下:

小于零:此实例在排序顺序中位于obj之前

零:此实例发生在与obj排序顺序相同的位置

大于零:此实例按照排序顺序跟随obj


您正在调用
Enumerable.Max
扩展方法,该方法将使用
Comparer.Default
获取比较器。而这又是由
Comparer
的静态构造函数分配的,它看到
Student
实现了
IComparable
,并实例化了一个类,该类使用
CompareTo
方法进行比较。编译器不参与任何这类操作(除了解析和插入对
Enumerable.Max
的调用),这正是框架作者编写代码的方式。如果你这么想的话,没有什么是你自己不能实现的。