gpt4 book ai didi

c# - 为什么我会收到此定义引用错误?

转载 作者:行者123 更新时间:2023-11-30 12:10:44 25 4
gpt4 key购买 nike

我正在使用在命名空间 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 作为第二个参数的双参数重载。

当我这样做时,我在构建过程中开始收到此错误:

The type 'System.Windows.Window' is defined in an assembly that is not referenced. You must add a reference to assembly 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

所以我的问题是为什么我在使用单参数重载时没有收到错误,但我确实在引用其他参数之一(以及错误的)时收到错误)?

编辑(添加子问题):

我还尝试了以下,但没有任何区别:

SetProgressState(myState, (IntPtr) myWindowHandle);

我认为通过显式转换,我可以避免编译器在实现适当的重载时产生混淆,但事实并非如此。

最佳答案

根据MSDN page on Overload Resolution , 编译器将首先选择潜在的候选人

Each of these contexts defines the set of candidate function members and the list of arguments in its own unique way

然后,选择最佳目标:

If the set contains only one function member, then that function member is the best function member.

我的理解是,当您使用 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 根本无法帮助编译器解析重载(请参见上面的示例)。

由于类型信息不存在,编译器会发出错误因为它无法确定。老实说,对于编译器来说,这是一个特性。

关于c# - 为什么我会收到此定义引用错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17322257/

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