我正在使用命名空间TaskBar
中定义的Microsoft.WindowsAPICodePack.Taskbar
方法。具体来说,我会专注于SetProgressState
这个问题。
这是我在询问SetProgressState
:
namespace Microsoft.WindowsAPICodePack.Taskbar
{
public class TaskbarManager
{
public void SetProgressState(TaskbarProgressBarState state);
public void SetProgressState(TaskbarProgressBarState state, IntPtr windowHandle);
public void SetProgressState(TaskbarProgressBarState state, System.Windows.Window window);
}
}
显然,我已经省略了该类的大部分定义,只是为了突出显示一个方法的重载。
到目前为止,我一直在使用单参数重载并且没有任何问题。但是,今天我尝试使用接受IntPtr
作为其第二个参数的双参数重载。
当我这样做时,我在构建期间开始收到此错误:
类型'System.Windows.Window'是在没有的程序集中定义的 引用。您必须添加对程序集的引用 'PresentationFramework,Version = 3.0.0.0,Culture = neutral, 公钥= 31bf3856ad364e35'
所以我的问题是为什么我没有因为使用单参数重载而出错,但是我做引用了其他一个错误(对于错误的一个) )?
编辑(添加子问题):
我也尝试了以下内容,但没有区别:
SetProgressState(myState, (IntPtr) myWindowHandle);
我认为通过显式转换,我会避免编译器在实现适当的重载时产生混淆,但事实并非如此。
答案 0 :(得分:2)
根据MSDN page on Overload Resolution,编译器将首先选择潜在的候选人
这些上下文中的每一个都以自己独特的方式定义候选函数成员集和参数列表
然后,选择最佳目标:
如果集合只包含一个函数成员,那么该函数成员是最好的函数成员。
我的理解是,当你用1参数调用它时,编译器甚至不考虑2参数方法。但是,当您使用2参数版本时,它需要有关参数类型的信息。在这种情况下,它需要知道System.Windows.Window
能够确定要调用哪个重载。
想象一下,您在单独的类库中有2个类
class Foo
{
}
class Bar : Foo
{
}
和另一个库中的4个方法
static void Do()
{
}
static void Do(Foo foo)
{
}
static void Do(Bar bar)
{
}
static Foo Get()
{
return new Bar();
}
您引用方法库和包含Foo
的库,但不包含包含Bar
的库。
然后,在您的应用程序中,您从方法库中获取类型为Foo
的对象(它也可能是Bar
,但您不知道)。编译器应该如何使用参数解析对Do()
的最终调用?
除非它也有Bar的类型信息,否则不能。
至于你的子问题,它是上述结果加上一个演员不一定强制选择过载的事实。让我们假设System.Windows.Window
暂时来自IntPtr
。将参数强制转换为IntPtr
无助于编译器根本解决重载问题(参见上面的示例)。
由于类型信息不存在,编译器会发出错误,因为它无法确定。老实说,对于编译器来说,这是一个功能。
答案 1 :(得分:1)
为了清楚起见,我会在此扩展我的评论。您的项目无法找到System.Windows.Window。当我说你需要投入时,我在评论中误解了:
using System.Windows;
到文件。
相反,项目需要引用System.Windows。您需要的引用将在错误消息中提供给您:PresentationFramework。您还需要包含PresentationCore(会弹出类似的错误,告诉您添加对PresentationCore的引用)。
类型'System.Windows.Window'在未引用的程序集中定义。您必须添加对程序集“ PresentationFramework ,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”
的引用