构造函数“CS1061”的c#错误“x不包含y的定义”

时间:2010-01-06 10:14:42

标签: c# class

public class KeyEvent {
        private Keys[] keys = null;
        public delegate void eventmethod();
        private eventmethod em;
        private object[] args;
        private bool thrown = false;
        public bool repeat = true;

        public bool isKey(Keys key) {
            if (keys == null) return true;
            foreach (Keys k in keys) {
                if (key == k) return true;
            }
            return false;
        }

        public void ThrowEvent() {
            if (!repeat && thrown) return;
            em.DynamicInvoke(args);
            this.thrown = true;
        }

        public KeyEvent(eventmethod D) {
            em = D;
        }
        public KeyEvent(Keys[] keys, eventmethod D) {
            this.keys = keys;
            this.KeyEvent(D);
        }
        public KeyEvent(eventmethod D, object[] args) {
            this.args = args;
            this.KeyEvent(D);
        }
        public KeyEvent(Keys[] keys, eventmethod D, object[] args) {
            this.args = args;
            this.KeyEvent(keys, D);
        }
    }
嘿,伙计们;这个类不会编译。我得到的错误是:

  

'BLBGameBase.KeyEvent'没有   包含'KeyEvent'的定义   并没有扩展方法'KeyEvent'   接受第一个类型的参数   'BLBGameBase.KeyEvent'可以找到   (你错过了使用指令或   汇编参考?)

无论如何,对于调用“this.KeyEvent(D)”或类似行的三行,会抛出此错误。 我不明白错误,因为它认为没有方法接受“KeyEvent”的第一个参数,但我不是试图用KeyEvent调用方法......谢谢。

6 个答案:

答案 0 :(得分:4)

要从另一个构建函数调用,请使用以下语法:

public KeyEvent(Keys[] keys, eventmethod D)
    : this(D)
{
    this.keys = keys;
}

正如您的代码所代表的那样,它正在尝试调用名为KeyEvent的常规方法(非构造函数)。

答案 1 :(得分:1)

正如Kent所说,你使用this(在同一个类中调用另一个构造函数)或base(调用基类构造函数)链接构造函数,语法为

ClassName(parameters) : this(args)
{
    // Body
}

ClassName(parameters) : base(args)
{
    // Body
}

请注意,这意味着链接构造函数在构造函数体的其余部分之前执行 - 在执行任何其他代码之后,无法使链式构造函数调用体。

我建议你有一个构造函数体,它实际上做了一些事情,并使所有其他构造函数只是链接到那个(直接或间接):

public KeyEvent(eventmethod D) : this(null, D){
}

public KeyEvent(Keys[] keys, eventmethod D) : this(keys, D, null) {
}

public KeyEvent(eventmethod D, object[] args) : this(null, D, args) {
}

public KeyEvent(Keys[] keys, eventmethod D, object[] args) {
    this.keys = keys;
    this.args = args;
    this.eventmethod = D;
}

(我还建议将eventmethod类型和D参数重命名为更常规。)

答案 2 :(得分:0)

你对this.KeyEvent(D)的调用正在生成错误,因为你以非法的方式调用了类自己的构造函数。为KeyEvent方法提供一个返回类型,以便不构造构造函数。

答案 3 :(得分:0)

这不是你如何称呼其他构造函数。你应该使用这样的方法:

    public KeyEvent(eventmethod D)
        : this(null, D, null)
    {
    }
    public KeyEvent(Keys[] keys, eventmethod D)
        : this(keys, D, null)
    {
    }
    public KeyEvent(eventmethod D, object[] args)
        : this(null, D, args)
    {
    }
    public KeyEvent(Keys[] keys, eventmethod D, object[] args) {
        this.args = args;
        this.keys = keys;
        em = D;
    }

答案 4 :(得分:0)

如果要调用其他构造函数,则必须使用base关键字:

public KeyEvent(eventmethod D, object[] args)
    :this(D) {
    this.args = args;
}

答案 5 :(得分:0)

你应该使用构造函数链接:

public KeyEvent(eventmethod D) : this(null, D, null {
}

        public KeyEvent(Keys[] keys, eventmethod D) : this(keys, D, null) {
        }

        public KeyEvent(eventmethod D, object[] args) : this(null, D, args) {

        }

        public KeyEvent(Keys[] keys, eventmethod D, object[] args) {
            this.args = args;
            this.keys = keys;
            this.em = D;
        }