Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 抽象类作为ref参数-编译器错误_C#_Abstract Class_Ref - Fatal编程技术网

C# 抽象类作为ref参数-编译器错误

C# 抽象类作为ref参数-编译器错误,c#,abstract-class,ref,C#,Abstract Class,Ref,我在VS2010上有一个简单的示例: using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { AbsClass absClass = new ConClass(); // I have tried this also and the error is differe

我在VS2010上有一个简单的示例:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AbsClass absClass = new ConClass();
            // I have tried this also and the error is different:
            // ConClass absClass = new ConClass();
            absClass.Id = "first";
            Console.WriteLine(absClass.Id);
            MyMethod(ref absClass);  // <<- ERROR.
            Console.WriteLine(absClass.Id);
            Console.ReadKey();
        }

        public void MyMethod(ref AbsClass a)
        {
            a.Id = "new";
        }
    }

    public abstract class AbsClass
    {
        public string Id { get; set; }
    }

    public class ConClass : AbsClass { }
}
使用系统;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
AbsClass AbsClass=新的ConClass();
//我也尝试过,但错误不同:
//ConClass absClass=新的ConClass();
absClass.Id=“第一”;
控制台写入线(absClass.Id);

MyMethod(参考absClass);//您需要将您的
MyMethod
设置为静态:

    public static void MyMethod(ref AbsClass a)
    {
        a.Id = "new";
    }
问题不是抽象类,“问题”是静态
Main
方法。静态方法没有实例,因此不能调用实例方法


.

您需要将您的
MyMethod
设置为静态:

    public static void MyMethod(ref AbsClass a)
    {
        a.Id = "new";
    }
问题不是抽象类,“问题”是静态
Main
方法。静态方法没有实例,因此不能调用实例方法


.

您需要将您的
MyMethod
方法设置为静态:

public static MyMethod(ref AbsClass a)
{
    a.Id = "new";
}
或者最好创建
程序
类的实例,并从该实例调用
MyMethod

Program p = new Program();
p.MyMethod(ref abs);
第一个方法之所以有效,是因为
Main
方法被标记为static,并且没有绑定到
Program
类的实例。NET Framework CLR在程序集中搜索名为
Main
的静态方法,该方法接受一个
字符串数组,并使该函数成为入口点。Yo你会注意到很多教程甚至MSDN代码示例都用static关键字标记
程序
类,当一个类中的所有方法都只包含静态方法时,这被认为是最佳实践


第二种方法之所以有效,以及为什么首选此方法,是因为您将
MyMethod
定义为实例方法。基本上,您需要对象的实例才能执行实例方法;
new
关键字创建指定类型的实例。可以调用静态方法没有对象实例,但也无法访问任何非静态实例成员(属性、私有/公共变量等)。通常,您希望避免使用静态方法和类,除非您必须实现实用程序类、使用扩展方法或提供帮助程序方法。

您需要将
MyMethod
方法设置为静态:

public static MyMethod(ref AbsClass a)
{
    a.Id = "new";
}
或者最好创建
程序
类的实例,并从该实例调用
MyMethod

Program p = new Program();
p.MyMethod(ref abs);
第一个方法之所以有效,是因为
Main
方法被标记为static,并且没有绑定到
Program
类的实例。NET Framework CLR在程序集中搜索名为
Main
的静态方法,该方法接受一个
字符串数组,并使该函数成为入口点。Yo你会注意到很多教程甚至MSDN代码示例都用static关键字标记
程序
类,当一个类中的所有方法都只包含静态方法时,这被认为是最佳实践


第二种方法之所以有效,以及为什么首选此方法,是因为您将
MyMethod
定义为实例方法。基本上,您需要对象的实例才能执行实例方法;
new
关键字创建指定类型的实例。可以调用静态方法没有对象的实例,但也无法访问任何非静态实例成员(属性、私有/公共变量等)。通常,您希望避免使用静态方法和类,除非您必须实现实用程序类、使用扩展方法或提供帮助器方法。

您遇到的编译器错误是什么?“非静态字段、方法或属性‘ConsoleApplication1.Program.MyMethod(ref ConsoleApplication1.AbsClass)’需要一个对象引用”-可以这么说,不是吗?@Femaref的回答是正确的。注释掉的版本(使用ConClass)的原因是什么不起作用的是,作为ref参数的参数传递的变量类型必须与参数类型完全匹配。这确保方法中的任何赋值都可以正常工作。您得到的编译器错误是什么?“非静态字段、方法或属性“ConsoleApplication1.Program.MyMethod”需要对象引用(ref ConsoleApplication1.AbsClass)“-有点像是说了什么,没有?@Femaref的答案是正确的。被注释掉的版本(带有ConClass)的原因是什么不起作用的是,作为ref参数的参数传递的变量类型必须与参数类型完全匹配。这确保了方法中的任何赋值都可以正常工作。是的,对。它现在以静态方式运行。但是为什么?或者,请链接到官方文档以了解它?抱歉…我没有看到您的评论降低代码。你是说如果我把它放在一个非主静态方法上,原始代码会运行良好吗?我添加了一个链接,但简而言之,原因已经在帖子中了。
Main
方法是
static
,因此,它不与类
程序的特定实例关联。因此,它只能调用其他方法也不依赖于
Program
的实例。不,它不依赖-
Main
方法是应用程序的入口点,运行时会在代码中查找静态
Main
方法。如果找不到,则会出现异常,程序将不会运行。我想您应该理解它。供将来的读者阅读s我将在问题中添加一个代码,该代码在MyMethod中运行良好,无需static子句(在manager类中)。谢谢Femaref。是的,对。它现在以静态方式运行。但是为什么?或者,请链接到官方文档以了解它?抱歉……我在代码下面没有看到您的注释。您的意思是如果我将其放在非Main上