编译器错误:无法识别属性

时间:2012-07-15 17:01:12

标签: c# class generics

我有一个列表,其中包含'Reference'类作为泛型类型。所以我应该能够用'Reference'类的子代填充我的列表,但编译器报告错误:

  

'naturalCalc.Enginee.Reference'不包含'Opener'的定义,并且没有可以找到接受类型'Opener'的第一个参数的扩展方法'naturalCalc.Enginee.Reference'(您是否缺少using指令或装配参考?)(CS1061)ToPostfix.cs:27,34

'ToPostfix'类中的切换代码确保该项在第二种情况下具有'Opener'属性。

// The 'MyBrackets' class which contains the 'Opener' property.
public class MyBrackets : naturalCalc.Enginee.Reference
{
    private bool opener;
    public MyBrackets( bool opener )
    {
        this.opener = opener;
    }

    public bool Opener { get { return this.Opener; } }
}

// The 'ToPostfix' class in which the error is taken place.
class ToPostfix
{
    List<Reference> infix = new List<Reference>();
    List<Reference> postfix = new List<Reference>();

    public ToPostfix(List<Reference> infixForm)
    {
        this.infix = infixForm;

        foreach (Reference item in this.infix)
        {
            switch ( item.ToString() )
            {
                case "naturalCalc.Enginee.MyFloat":
                    this.postfix.Add(item);
                    break;

                case "naturalCalc.Enginee.MyBrackets":
                    if (item.Opener)
                    {
                        this.postfix.Add(item);
                    }
                    break;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

如果可能,您应该尝试将方法移动到界面中。

如果无法做到这一点,您可以动态测试类型并按如下方式进行转换:

Opener opener = item as Opener;
if (opener != null)
{
        if (opener.Opener)
        {
            this.postfix.Add(item);
        }
}

此外,您的getter无法正常工作。您还应该学会使用自动实现的属性:

public class MyBrackets : naturalCalc.Enginee.Reference
{
    public MyBrackets(bool opener)
    {
        this.Opener = opener;
    }

    public bool Opener { get; private set; } // Auto-implemented property.
}

答案 1 :(得分:0)

不是一个完整的答案,但我相信你的MyBrackets课程有错误。 openerOpener属性不同。

我认为应该是:

public class MyBrackets : naturalCalc.Enginee.Reference
{
    public MyBrackets(bool opener)
    {
        this.Opener = opener;
    }

    public bool Opener 
    {
        private set { this.Opener = value; }
        get { return this.Opener; } 
    }
}

此致

答案 2 :(得分:0)

您使用List Reference,但在Opener中定义MyBracketClass属性。如果您希望从Reference实例访问您的媒体资源,请将其移至那里。