在C#里面 引用类型 的参数 和对象 内部保存的都只是引用. → 当前实例存放在 托管堆上的地址
当你的一个方法 ShowName(string name) 调用 并传递一个 参数进去的时候. 其实本质上 ShowName 方法获取到的是当前参数的引用.
引用有没有数据 这个方法是不管的.
当时此方法会通过参数的引用 得到当前参数的类型指针 → 它根据你传入的参数 是否为 string类型 或者是string 类型的子类.如果 上述两种情况都成立的话.
那么在编译器的级别 它会让你编译通过. 但是到运行的时候,如果 你之前传递的引用 确实没有值的话 那么就被报一个非常经典的错误 "未将参数对象引用到参数的实例" .
补充一点: 当你方法的参数 为string的时候,那么你传递的参数 就必须为string类型. 原因是 string 类 在.NET 中被申明成了一个密封类.密封类不能被继承.
在C#中 方法的参数是协变的. 但是 string 是一个密封类 它不具备 参数协变的前提. |