0

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

'naturalCalc.Enginee.Reference'不包含 for 的定义,也找不到接受第一个类型参数的'Opener'扩展方法(您是否缺少 using 指令或程序集引用?)(CS1061)'Opener''naturalCalc.Enginee.Reference'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;
            }
        }
    }
}
4

3 回答 3

1

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

如果这是不可能的,您可以动态测试类型并按如下方式进行转换:

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

您的吸气剂也无法正常工作。您还应该学习使用自动实现的属性:

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

    public bool Opener { get; private set; } // Auto-implemented property.
}
于 2012-07-15T17:04:55.687 回答
0

您正在使用Listof Reference,但OpenerMyBracketClass. 如果您希望从Reference实例访问您的属性,请将其移到那里。

于 2012-07-15T17:18:13.073 回答
0

不是一个完整的答案,但我相信您的 MyBrackets 课程有错误。 opener并且Opener不是同一个属性。

我认为应该是:

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; } 
    }
}

问候

于 2012-07-15T17:06:25.353 回答