Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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# - Fatal编程技术网

C# 对继承的抽象类的类成员的实例访问

C# 对继承的抽象类的类成员的实例访问,c#,C#,我想这是星期四 Main()不应该访问本地和本地吗 using System; namespace HelloGoodbyeOperator { public abstract class HGOperator { public string _greeting { get; set; } public bool _x { get; internal set; } public bool _y { get; internal set;

我想这是星期四

Main()不应该访问本地和本地吗

using System;

namespace HelloGoodbyeOperator {

    public abstract class HGOperator {
        public string _greeting { get; set; }
        public bool _x { get; internal set; }
        public bool _y { get; internal set; }

        public static implicit operator HGOperator(bool mode) {
            object ret = new object();
            if (mode)
                ret = new HGOperator_Hello { _greeting = "hello", _XLocal = 10 };
            else
                ret = new HGOperator_Goodbye { _greeting = "goodbye", _YLocal = 20 };

            return (HGOperator)ret;
        }
    }



    public class HGOperator_Hello : HGOperator { 
        public int _XLocal { get; set; }
        public HGOperator_Hello() { _x = true; Console.WriteLine("HGOperator_Hello //" + _XLocal.ToString() + "\\\\"); }
    }



    public class HGOperator_Goodbye : HGOperator { 
        public int _YLocal { get; set; }
        public HGOperator_Goodbye() { _y = false; Console.WriteLine("HGOperator_Goodbye //", _YLocal, "\\\\"); }

    }



    class Program {
        static void Main(string[] args) {

            HGOperator hg = true;
            Console.WriteLine(hg._greeting);
            test(hg);

            Console.WriteLine("");

            hg = false;
            Console.WriteLine(hg._greeting);
            test(hg);

            Console.ReadKey();
        }

        static void test(HGOperator hg) {
            if (hg is HGOperator_Hello) {
                Console.WriteLine(hg._x);
                //Console.WriteLine(hg._XLocal);
            } else {
                Console.WriteLine(hg._y);
                //Console.WriteLine(hg._YLocal);
            }
        }
    }
}
这是输出

你好//0\

你好

真的

再见//

再见

假的

我能理解如何尝试访问hg。HGOperator类型的本地将是一场噩梦,反之亦然。但我仍然认为,我可以谨慎地接触到各自的成员

而且我敢打赌这是不动产。这两个具体构造函数在Console.Writeline()s上没有_XLocal&_YLocal的值。如果没有.ToString(),则只打印一个“”。为什么不呢?
谢谢。

问题是编译器不知道
hg
hgperator\u Hello
hgperator\u bye
的派生类型。因此,在
if
中,您需要创建另一个变量并强制转换它:

if (hg is HGOperator_Hello)
{
    var helloHg = (HGOperator_Hello)hg;
    Console.WriteLine(helloHg._x);
    Console.WriteLine(helloHg._XLocal);
}
else
{
    var goodbyeHg = (HGOperator_Goodbye)hg;
    Console.WriteLine(goodbyeHg._y);
    Console.WriteLine(goodbyeHg._YLocal);
}

Main
在哪里?问题是什么?@GlennFerrie“总是在哪里”。Lol.
类程序{static void Main(string[]args){
Huh!我从没见过它。谢谢你的帮助,我刚刚实现了这个功能。if is事实上证明了编译器知道hg是一个Hello类。我不是说你的答案完全错了。我只是说编译器_可以在这里得到一个更聪明的功能。我实现了if()测试更像是一个运行时的挑战,但是系统可以聪明地知道,预编译,如果是真的,那么hg下一个版本一定是Hello。