首页 > 后端开发 > C++ > 为什么 C# 扩展方法的第一个参数不能是'ref”参数?

为什么 C# 扩展方法的第一个参数不能是'ref”参数?

Barbara Streisand
发布: 2025-01-07 16:57:42
原创
1046 人浏览过

Why Can't the First Parameter of a C# Extension Method Be a `ref` Parameter?

C# 扩展方法:为什么第一个参数不能是 ref(大多数)

扩展方法可以优雅地向现有类型添加功能,而无需更改其源代码。 但是,存在一个关键限制:第一个参数(表示方法所操作的实例)不能是 ref 参数(下面指出的例外情况)。

限制背后的原因

ref 关键字允许方法直接修改作为参数传递的变量的值。在标准方法调用中,这是完全可以接受的。但对于扩展方法,第一个参数隐式表示调用扩展的对象。 设置此参数ref将从根本上改变扩展方法的工作方式。

扩展方法扩展类型的行为;它不会替换或创建新实例。 在第一个参数上允许使用 ref 参数将有效地让扩展方法用完全不同的对象替换原始对象,从而打破了扩展方法的核心概念。

说明性示例

考虑常规方法:

<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj)
{
    obj = newObj; //Directly replaces the original object
}</code>
登录后复制

现在,想象一个类似的扩展方法(假设允许):

<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj)
{
    obj = newObj; //Would replace the original object
}</code>
登录后复制

这个假设的扩展方法不会修改原始的obj,而是将一个新对象分配给引用它的变量。这种行为与扩展方法的预期目的不一致。

C# 7.2 和值类型:异常

虽然该限制通常适用于引用类型(类、接口),但 C# 7.2 引入了值类型(结构)的例外。 对于结构,在第一个参数 ref 上使用 允许的。

这允许创建可以修改结构内部状态的扩展方法。 但是,请务必记住此异常仅适用于值类型,而不适用于引用类型。 保留原始实例的核心原则仍然适用于引用类型。

以上是为什么 C# 扩展方法的第一个参数不能是'ref”参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板