C# 为什么可以';编译器不能阻止这些运行时强制转换异常吗?

C# 为什么可以';编译器不能阻止这些运行时强制转换异常吗?,c#,C#,但我认为编译器确实知道,或者可以通过查看引用此方法的所有位置来轻松知道传递给PromoteEmployee的类型(至少对于没有运行时条件决定传递什么类型的情况) 那么,当带有一些额外逻辑的编译器很容易发现异常时,为什么要让强制转换异常在运行时发生呢 因此,您基本上希望编译器检查您调用函数的代码中的所有地方,然后检查传递的参数类型,然后针对每个调用,转到函数中使用参数的每一行,并检查接收类型是否能够转换或转换为它所检查的每一种类型 可能吗?也许吧,但只有在少数情况下,这样做不值得花费额外的编译时间

但我认为编译器确实知道,或者可以通过查看引用此方法的所有位置来轻松知道传递给PromoteEmployee的类型(至少对于没有运行时条件决定传递什么类型的情况)


那么,当带有一些额外逻辑的编译器很容易发现异常时,为什么要让强制转换异常在运行时发生呢

因此,您基本上希望编译器检查您调用函数的代码中的所有地方,然后检查传递的参数类型,然后针对每个调用,转到函数中使用参数的每一行,并检查接收类型是否能够转换或转换为它所检查的每一种类型

可能吗?也许吧,但只有在少数情况下,这样做不值得花费额外的编译时间

另外,想象一下这种情况:

class Program
    {
        static void Main(string[] args)
        {
            DateTime newYears = new DateTime(2013, 1, 1);
            PromoteEmployee(newYears);
        }

        public static void PromoteEmployee(object o)
        {
            // At this point, the compiler doesn't know exactly what type of object o refers to. So the compiler allows the code to compile...

            Employee e = (Employee)o; // this results in invalid cast exception at runtime
        }
    }

    class Employee
    {

    }
这意味着编译器在将参数传递给函数之前,还必须完成参数所经历的每一次赋值


所以,底线是:是的,这在技术上是可能的,但不值得付出努力和时间,而且会鼓励糟糕的编程实践。

编译器不知道来自其他程序集的引用,将它看作是一个程序集和其他应用程序调用任何类型的方法,那么编译器是如何停止构建这个库的?编译器不能总是知道,谁在引用程序集。此外,有时人们使用反射来调用方法,这会给编译器带来很多麻烦。您在这里试图解决的实际用例是什么?或者你只是在做实验?编译器不会查看您的代码以了解您试图对哪个对象执行的操作。DateTime可以强制转换为object,这样它可以编译方法调用,而in object可以强制转换为Employee,这就是它编译方法体的原因。@RufusL:c#7.0中的模式匹配,它被简化为
如果(o是Employee e)e.property
智能编译器不会帮助一个差劲的程序员,如果您发现自己正在使用对象类型来解决应用程序设计问题,我建议您重新考虑应用程序设计。如果您想使用松散类型的语言进行开发,请尝试javascript,但是在这样的环境中可能会出现运行时错误。
    static void Main(string[] args)
    {
        DateTime newYears = new DateTime(2013, 1, 1);
        object ob = newYears;
        PromoteEmployee(ob);
    }