Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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_C# - Fatal编程技术网

C# 访问基类变量C

C# 访问基类变量C,c#,C#,我有基础课 public class X { public int Id; public int i; } 和派生类 public class Y : X { //other variables } 我的解决方案中有3个项目。X类在项目A中,Y类在项目B中,而在项目C中,我正试图做到: Y newY = new Y(); newY. // this is where no variables from base class are showed (no Id or i) 如

我有基础课

public class X
{
   public int Id;
   public int i;
}
和派生类

public class Y : X
{

//other variables

}
我的解决方案中有3个项目。X类在项目A中,Y类在项目B中,而在项目C中,我正试图做到:

Y newY = new Y();
newY. // this is where no variables from base class are showed (no Id or i)
如果我从项目C中引用项目A,它就会工作。但是我能在不引用C中的项目A的情况下完成它吗

现有的参考是:B->A和 C->B

项目B确实需要引用项目A,因为Y类派生自X类,并且一些父功能仅写在项目A中

所以在邮件项目中只添加ProjectB而不是ProjectA的引用,并且尝试调用ProjectB的功能肯定会在编译时失败

如下图所示

//of Project A
public class X
{
    public string XStr;
    public void MethodOfX()
    {
        
    }
}
//of Project A
public class X
{
    public string XStr;
    public void MethodOfX()
    {
        Console.WriteLine("Method of x");
    }
}

您可以看到,在这里您也可以访问类x的属性。作为项目A的参考,已添加到项目B中

在主课上。如果我们尝试以下操作,只需添加ProjectB的引用

    static void Main(string[] args)
    {
        Y y = new Y();
        y.MethodOfY();
    }
在Y=newy时,我们将在编译时得到此错误

类型“ProjectA.X”是在未引用的程序集中定义的。您必须添加对程序集“ProjectA,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的引用

这里的错误是不言自明的。它只是简单地说,在我们的例子中,为了执行Y=newy,您需要处理ProjectA.X,这是因为我们继承了它,而拥有ProjectA.X定义的程序集尚未在主项目中引用

看看这个

在这里,我们让Y继承X,我们也需要在主项目中添加ProjectA的引用,因为在这种情况下,Y包含ProjectA中定义的一些功能

由于我们还没有在主项目中添加ProjectA的引用,在主项目中,我们正在尝试创建Y的对象,该对象将无法公开Y的那些在ProjectA中定义的功能和成员

但如果我们像下面这样更改代码

//of Project A
public class X
{
    public string XStr;
    public void MethodOfX()
    {
        
    }
}
//of Project A
public class X
{
    public string XStr;
    public void MethodOfX()
    {
        Console.WriteLine("Method of x");
    }
}

请注意,现在Y不是继承X,而是简单地创建X的实例并使用它

static void Main(string[] args)
    {
        try
        {
            Y y = new Y();
            y.MethodOfY();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        Console.Read();
    }
在我们的主项目中,即使只添加了ProjectB而不是ProjectA的引用,上述代码也不会导致任何异常。因为在这里创建Y主项目的对象时不需要处理ProjectA,因为Y的所有功能和成员都只在projectB中

当调用MethodOfY方法时,即使该方法在内部也调用了x方法,如果在调试时,应用程序的运行路径中存在ProjectA的dll(通常在Debug文件夹中),也会处理该调用


注意:如果ProjectA的dll在任何情况下都不存在,它将在调用MethodOfY时抛出一个exeption,说它无法加载ProjectA dll,当然是因为它不存在

他说每个类在单独的dll中,使用不同的dll来使用Y类,并且没有IntelliSense你绝对需要一个c=>一个引用;使用nuget包引用,它现在可能是可传递的;如果您想从项目C访问项目A中的类X,则必须有项目C->项目A的引用。如果您有项目B->项目A和项目C->项目B,Visual Studio可能会在后台添加项目C->项目A。您能解释一下为什么吗?因为据我所知,我在项目C中使用的是项目B中的一个类,我引用了项目C中的项目B?因为X的定义,可以说它的元数据,在项目a中。