Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以确定COM互操作类型中可选参数的默认值?_C#_C# 4.0_Com - Fatal编程技术网

C# 是否可以确定COM互操作类型中可选参数的默认值?

C# 是否可以确定COM互操作类型中可选参数的默认值?,c#,c#-4.0,com,C#,C# 4.0,Com,我正在使用C#4.0实例化一个Excel.Application,并打开一个Excel.Workbook。简而言之,我的代码如下所示: Excel.Application xlApp; Excel.Workbook xlWorkBook; xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open("someFile"); HRESULT SaveAs( [in, optional] VARIANT Filen

我正在使用C#4.0实例化一个
Excel.Application
,并打开一个
Excel.Workbook
。简而言之,我的代码如下所示:

Excel.Application xlApp;
Excel.Workbook xlWorkBook;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open("someFile");
HRESULT SaveAs(
    [in, optional] VARIANT Filename,
    [in, optional] VARIANT FileFormat,
    [in, optional] VARIANT Password,
    blahblah...
    [in, optional, defaultvalue(1)] XlSaveAsAccessMode AccessMode,
    blahblah...
    [in, optional] VARIANT Local,
    [in, lcid] long lcid);
Open()
方法有一堆我不需要提供的可选值。这很方便,只是我不知道这些可选参数的默认值是什么。因此,我无法决定是否必须提供价值

在这种情况下,我可以在MSDN文档中找到一些参数的所需信息。是否有一种通用方法来确定COM互操作类型中可选参数的默认值

更新:

使用
MSO.dll
上的
oleview
,我为
工作簿
界面签出了相应的IDL。对于
SaveAs()
方法,它如下所示:

Excel.Application xlApp;
Excel.Workbook xlWorkBook;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open("someFile");
HRESULT SaveAs(
    [in, optional] VARIANT Filename,
    [in, optional] VARIANT FileFormat,
    [in, optional] VARIANT Password,
    blahblah...
    [in, optional, defaultvalue(1)] XlSaveAsAccessMode AccessMode,
    blahblah...
    [in, optional] VARIANT Local,
    [in, lcid] long lcid);
在VisualStudio中,intellisense为大多数参数显示
[object Filename=Type.Missing]
,我想这是有意义的,因为IDL没有提供任何关于类型(
VARIANT
)或任何默认值的信息。但是,对于参数
AccessMode
,IDL提供所需信息,intellisense会显示该信息

所以我想现在的问题是:为什么IDL不能像对待
AccessMode
那样,更具体地描述所有参数的类型(和默认值)

为什么IDL对类型(和默认值)没有更具体的描述

它是具体的类型,它是变体。不必指定默认值,变量可以指定“未指定”。实际上,在类型库中指定默认值是可能的,您可以从反向工程IDL中看到这一点


这里有很多灵活性。但是,如果变量值为“未指定”,则COM服务器将替换它认为默认的任何值,或者为未指定的变量指定特定行为。找出可能是什么的唯一方法是通过文档。这确实不总是很好。

智能感知不显示预期值吗?@MBen:请参阅我对更新下问题的补充,以获得答案。好的,明白了。现在,由于这些是
变量
参数,因此不必指定默认值,但可以指定默认值吗?换句话说,是否可以为
变量
类型参数指定默认值?否,变量本身不带有默认值。只能在类型库中使用方法声明中的[defaultvalue]属性指定特定的默认值。如果源代码省略了一个值,编译器的工作就是创建一个具有该值的变量。我不确定是否完全理解您的解释,所以我将重写我的问题。在
SaveAs()
示例中,在技术上是否可能有
[In,可选,defaultvalue(“workbook.xls”)]变量文件名
,而不是
[In,可选]变量文件名
?技术上是的。当然,它实际上并不存在于类型库中,您也没有添加它的选项。现在我明白了,因此在这种情况下,COM对象(=Microsoft团队)的创建者出于某种原因决定不在接口中包含(所有)默认值。这对我来说是违反直觉的。但是,再仔细想想,即使知道默认值也不能保证您真正理解相应的行为,作为对象的用户,我应该阅读文档以获得对方法的全面理解——无论是否使用默认值。