【问题标题】:Parameterless constructing constructorless class (from another assembly)无参数构造函数构造函数少类(来自另一个程序集)
【发布时间】:2016-07-20 08:42:02
【问题描述】:

我有这个来自 NuGet 包的类:

using System.Windows.Forms;

namespace FMUtils.KeyboardHook
{
    public class KeyboardHookEventArgs
    {
        public bool isRShiftPressed { get; }
        public bool isRWinPressed { get; }
        public bool isShiftPressed { get; }
        public bool isWinPressed { get; }
        public Keys Key { get; }

        public override string ToString();
    }
}

它在一个程序集中,然后被 this 引用:

using System;
using System.Windows.Forms;
using FMUtils.KeyboardHook;

namespace SpeedyGonzales
{
    public class MyClass
    {   
        public MyClass()
        {
            var key = new KeyboardHookEventArgs();
        }
    }
}

这在编译时中断,给我这个错误:

'KeyboardHookEventArgs' 不包含取 0 的构造函数 论据

现在我发现了关于这个问题的几件事:

  1. 每个类都需要一个构造函数
  2. 如果您没有显式提供 any 构造函数,则会调用直接父级的 无参数 构造函数
  3. 如果父级没有这样的构造函数,则会抛出错误

这似乎是我的情况,但由于我的类没有继承任何东西,这意味着唯一的直接父是..对象?对象没有无参数构造函数吗?请澄清。

【问题讨论】:

  • public override string ToString(); 看起来不对 - 这真的可以编译吗?
  • 这是一个 NuGet 包.. 很常用。代码来自给定程序集的内部。为什么看起来不对?
  • 类可能没有任何构造函数——在这种情况下它将有一个默认的无参数构造函数。看起来你还没有显示整个代码,这段代码甚至不应该编译。
  • 因为它没有主体 - 你是否可能从包中反编译它?
  • 我认为您需要重新阅读该软件包应该为您做什么。它似乎是用an internal constructor 设计的——也就是说,您不应该尝试构造该特定类的实例。

标签: c# class inheritance


【解决方案1】:

您的问题中显示的源代码与source in the NuGet package 不匹配。 KeyboardHookEventArgs 类实际上包含一个带有参数的构造函数。此构造函数的签名如下所示:

internal KeyboardHookEventArgs(FMUtils.KeyboardHook.Hook.KBDLLHOOKSTRUCT lParam)

构造函数被标记为internal,即它在包含声明的程序集之外不可见(这就是您可能在 Visual Studio 中看不到它的原因)。因此,您不能直接在代码中创建 KeyboardHookEventArgs 类型的对象。这可能是该库的作者有意为之(因为他明确声明了内部构造函数)。

intended usage 是使用Hook 类来创建钩子。如您所见,KeyboardHookEventArgs 类型的对象随后由 Hook 类创建,并作为事件处理程序的参数传递给您的代码:

var KeyboardHook = new Hook("Global Action Hook");
KeyboardHook.KeyDownEvent += KeyDown;
// Also: KeyboardHook.KeyUpEvent += KeyUp;

private void KeyDown(KeyboardHookEventArgs e)
{
    // handle keydown event here
    // Such as by checking if e (KeyboardHookEventArgs) matches the key you're interested in

    if (e.Key == Keys.F12 && e.isCtrlPressed)
    {
        // Do your magic...
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多