鉴于以下代码,有人可以解释为什么我可以将COM对象作为值参数传递但不作为参考参数传递吗?
private void TestRelease()
{
Excel.Workbook workbook = excel.ActiveWorkbook;
ReleaseVal(workbook); // OK
ReleaseRef(ref workbook); // Fail
}
private void ReleaseVal(Object obj)
{
if (obj != null)
{
Marshal.ReleaseComObject(obj);
obj = null;
}
}
private void ReleaseRef(ref Object obj)
{
if (obj != null)
{
Marshal.ReleaseComObject(obj);
obj = null;
}
}
答案 0 :(得分:3)
这与COM对象无关,它只是C#的一个规则。除非参考类型与参数类型相同,否则您无法将引用类型传递给out
或ref
参数。
否则它将允许不安全的情况,如下面的
public void Swap(ref Object value) {
value = typeof(Object);
}
string str = "foo";
Swap(out str); // String now has an Type???
现在,string
引用引用的类型为Type
的对象是错误且非常不安全的。