我一直在尝试编写自己的自定义构造函数,但收到有关base()
构造函数的错误。我一直在寻找如何解决这个错误,但没有找到任何内容,互联网上的所有示例都显示与我的相同的代码。
Whole Exception.cs内容:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace RegisService
{
public class Exceptions : Exception
{
}
public class ProccessIsNotStarted : Exceptions
{
ProccessIsNotStarted()
: base()
{
//var message = "Formavimo procesas nestartuotas";
//base(message);
}
ProccessIsNotStarted(string message)
: base(message) {}
ProccessIsNotStarted(string message, Exception e)
: base(message, e) {}
}
}
第一次重载base()
正在运行,没有抛出任何错误。第二和第三
超载告诉我:
“RegisService.Exceptions不包含构造函数 1(2)参数“
我尝试解决错误的另一种方法是:
ProccessIsNotStarted(string message)
{
base(message);
}
ProccessIsNotStarted(string message, Exception e)
{
base(message, e);
}
这一次,VS告诉我:
“在此上下文中使用关键字'base'无效”
那么,问题出在哪里?看起来base()
构造函数有一些奇怪的重载,或者我是以不恰当的方式调用它?
答案 0 :(得分:6)
您的Exceptions
类需要定义您想要提供的所有构造函数。 System.Exception
的构造函数不是虚拟的或抽象的。关键字base
不会调用所有基类的成员,而是调用您在类声明中提供的一个基类。看看这个:
public class Exceptions : Exception
{
public Exceptions(string message)
: base(message) {}
}
public class ProccessIsNotStarted : Exceptions
{
public ProccessIsNotStarted()
: base()
{
}
public ProccessIsNotStarted(string message)
: base(message)
{
// This will work, because Exceptions defines a constructor accepting a string.
}
public ProccessIsNotStarted(string message, Exception e)
: base(message, e)
{
// This will not work, because Exceptions does not define a constructor with (string, Exception).
}
}
默认情况下定义无参数构造函数。要隐藏它,您需要声明它private
。
关于MSDN,你应该保持你的异常继承层次结构:
如果您正在设计需要创建自己的异常的应用程序,建议您从Exception类派生自定义异常。最初认为自定义异常应该来自ApplicationException类;但实际上并没有发现增加显着的价值。
您也可以查看this page。
答案 1 :(得分:1)
完全删除Exceptions
课程,让ProccessIsNotStarted
直接从System.Exception
继承。
类are not automatically "copied" to derived classes的构造函数;它们可以使用base
,但您必须手动定义它们。
答案 2 :(得分:1)
base指的是直接基类,而不是链中的任何基类。您的ProcessIsNotStarted类是RegisService.Exceptions的直接子类型,而不是System.Exception。 RegisService.Exceptions没有带签名的构造函数(字符串,异常)或(字符串)。
尝试将两个构造函数添加到RegisService.Exceptions基类。
答案 3 :(得分:1)
如果您检查以下代码:
public class Exceptions : Exception
{
}
您会注意到没有构造函数。嗯,这是一种谎言,因为可以使用默认的公共构造函数,但是没有自定义的构造函数。
如果您希望公开Exception
到Exceptions
的构造函数,那么您将不得不在Exceptions
上定义它们并使用base
从那里调用它们,因为继承调用base
的异常会调用Exceptions
,因此Exception
不是他们的base
,因此构造函数无法访问。
public class Exceptions : Exception
{
Exceptions(string message)
: base(message) { }
Exceptions(string message, Exception e)
: base(message, e) { }
}
然后,你可以new Exceptions("", null)
做得很好。而且,你的基础构造函数在使用继承时调用。
你是否从这个继承链中获得任何价值,我不知道,你可能想要取出中间人,可以这么说,按照另一个建议。