Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译器错误:无法识别属性_C#_Class_Generics - Fatal编程技术网

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

C# 编译器错误:无法识别属性,c#,class,generics,C#,Class,Generics,我有一个列表,其中包含作为泛型类型的“Reference”类。因此,我应该能够用“Reference”类的子类填充列表,但编译器报告了一个错误: 'naturalCalc.engee.Reference'不包含'Opener'的定义,并且找不到接受类型为'naturalCalc.engee.Reference'的第一个参数的扩展方法'Opener'(是否缺少using指令或程序集引用?)(CS1061)ToPostfix.cs:27,34 “ToPostfix”类中的开关代码确保在第二种情况下该

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

'naturalCalc.engee.Reference'
不包含
'Opener'
的定义,并且找不到接受类型为
'naturalCalc.engee.Reference'
的第一个参数的扩展方法
'Opener'
(是否缺少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; } }
}

//发生错误的“ToPostfix”类。
类ToPostfix
{
列表中缀=新列表();
列表后缀=新列表();
公共拓扑修复(列表infixForm)
{
this.infix=infixForm;
foreach(此中缀中的参考项)
{
开关(item.ToString())
{
案例“naturalCalc.Enginee.MyFloat”:
this.postfix.Add(项目);
打破
案例“naturalCalc.Engineee.My括号”:
如果(项目开始)
{
this.postfix.Add(项目);
}
打破
}
}
}
}

如果可能,您应该尝试将该方法移动到接口中

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

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

这不是一个完整的答案,但我相信你的MyBracks类有一个错误。
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; } 
    }
}

关于

您使用的是
参考
列表
,但在
MyBracketClass
中定义了
Opener
属性。如果希望从
引用
实例访问属性,请将其移动到该实例。

OP只需在
获取
中使用小写的
开瓶器
public bool-Opener{get{返回this.Opener;}}
@Kevin-yes,这就足够了=)
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; } 
    }
}