gpt4 book ai didi

c# - C# 中的对象、参数和 ref 关键字

转载 作者:太空狗 更新时间:2023-10-29 22:25:02 24 4
gpt4 key购买 nike

当方法的形式参数是“对象”类型时,通过继承,实际参数可以是任何对象类型。一旦在方法中,对象就可以转换为预期的类型。一切都很好。

但是,如果方法的签名有一个形式参数“object”,使用 ref 关键字,即 methodname(ref object),编译器会抛出一个错误,指出:

“'ByRefTest.Program.changeMeByRef(ref object)' 的最佳重载方法匹配有一些无效参数。“参数‘1’:无法从‘ref ByRefTest.Person’转换为‘ref object’”

A. Friedman 的博客 http://crazorsharp.blogspot.com/2009/07/passing-objects-using-ref-keywordwait.html 中很好地解释了将对象作为参数传递时使用或不使用 ref 关键字的区别。 ,但是当“object”类型的形式参数使用 ref 关键字时,为什么不能将自定义类型作为实际参数传递?

举个例子:

class Program
{
static void Main(string[] args)
{
Person p = new Person();

changeMe(p); // compiles
changeMeByRef(ref p); // throws error

object pObject = (object)p;
changeMeByRef(ref pObject); // compiles
}


public static void changeMeByRef(ref object obj)
{
Person p = (Person)obj;
}

public static void changeMe(object obj)
{
Person p = (Person)obj;

}
}

public class Person
{
}

谢谢。

ps 我刚刚将签名更改为:

public static void changeMeByRef (ref T obj) where T : Person

这为 changeMeByRef(ref p) 编译;

最佳答案

因为该方法可能会将参数更改为具有不同类型的值,这违反了用于参数的变量类型。简单示例:

public void Foo(ref object x)
{
x = "hello";
}

...

// This doesn't compile, fortunately.
Stream y = null;
Foo(ref y);

y 的值是多少?在方法中赋值之后?它应该是一个字符串——但这违反了变量的类型。那将是一件非常糟糕的事情,完全违反了类型安全。这与 IList<T> 的泛型不变性的原因相同。即使在 .NET 4.0 中。

埃里克·利珀特 recently blogged about the invariance of ref in more detail .

关于c# - C# 中的对象、参数和 ref 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1498123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com