C# 抽象类作为ref参数-编译器错误
我在VS2010上有一个简单的示例: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
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上