【发布时间】:2013-06-26 14:01:57
【问题描述】:
我正在使用命名空间Microsoft.WindowsAPICodePack.Taskbar 中定义的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,版本=3.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35'
所以我的问题是为什么我在使用单参数重载时没有收到错误,但我确实在引用其他参数之一时遇到了错误(以及 错误的)?
编辑(添加子问题):
我也尝试了以下方法,没有任何区别:
SetProgressState(myState, (IntPtr) myWindowHandle);
我认为通过显式转换,可以避免编译器在实现适当的重载时混淆,但事实并非如此。
【问题讨论】:
-
只是等待 Eric Lippert 过来,但我猜:您可以链接使用项目引用的类型的重载,但只要编译器/链接器必须检测到最佳匹配(因为有多个双参数重载,它必须检查所有重载),它必须知道所有可能的拟合重载正在使用的所有类型。也许从 C# 规范中阅读 7.4.2 Overload Resolution。
-
@CodeCaster 我也怀疑过,但后来我想知道为什么这没有什么不同:
SetProgressState(myState, (IntPtr) myWindowHandle);。这不应该让我想要的编译器清楚吗? -
另外,您可能需要仔细检查您的项目中是否引用了 PresentationFramework 并且您是
#using System.Windows。最坏的情况,检查对象浏览器中的Windows.Window。 -
@RyanWH 对
System.Windows的引用也没有区别,因为它专门要求System.Windows.Window。为了清楚起见(因为问题不是),如果可能的话,我会尽量避免额外的参考。 -
@DonBoitnott 因为编译器不只是为了快乐的情况而存在。 :-) 它不应该只返回第一个最佳匹配,而是将它们全部列出以检测是否存在模棱两可的匹配。
标签: c# .net compiler-construction compiler-errors