我不确定这里究竟是什么问题。我正在使用2个字符串并且我一直在收到错误“字段初始化程序无法引用非静态字段,方法或属性'Captcha.Capture.CaptureTime'”。
以下是代码中的代码段:
string CaptureTime = DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "-" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
string SaveFormat = Properties.Settings.Default.SaveFolder + "Screenshot (" + CaptureTime + ")." + Properties.Settings.Default.ImageFormat;
我不会详细说明为什么我以这种特殊方式使用字符串。一切正常。我猜它与另一个字符串中的字符串有关?这可能是完全明显的,但我真的不知道。有什么想法吗?
答案 0 :(得分:7)
不,它与此无关 - 只是实例字段初始值设定项不能使用其他实例字段或实例方法。这是一个简单的例子:
class Test
{
int x = 0;
int y = x + 1;
}
将初始化移动到构造函数体中可能最简单。顺便说一句,你不应该在一个初始化程序中多次访问DateTime.Now
- 它可能会在不同的调用之间发生变化,从而导致可怕的结果。使用局部变量 - 从构造函数再次更容易完成:
string CaptureTime;
string SaveFormat;
public YourType()
{
DateTime now = DateTime.Now;
CaptureTime = now.Month + "-" + now.Day + "-" + now.Year + "-" +
now.Hour.ToString() + now.Minute.ToString() + now.Second.ToString();
SaveFormat = Properties.Settings.Default.SaveFolder +
"Screenshot (" + CaptureTime + ")." +
Properties.Settings.Default.ImageFormat;
}
顺便说一句,生成CaptureTime的简单方法是:
CaptureTime = now.ToString("MM-dd-yyyy-HHmmss");
答案 1 :(得分:3)
错误告诉您到底发生了什么。您正尝试使用field-initializer语法初始化实例字段SaveFormat
,其值取决于实例字段CaptureTime
。将这些值的初始化移动到实例级构造函数中,您就可以了。
顺便说一下,将DateTime.Now
保存在临时值中,而不是像现在一样重复调用。如果在代码执行时翻转日期边界怎么办?呸。
答案 2 :(得分:1)
在C#中禁止编写相互引用的非静态字段初始值设定项,因为通常初始化顺序是未定义的。
将初始化移动到类的构造函数
最好使用String.Format或DateTime.Format(string)进行日期格式化。
答案 3 :(得分:0)
您需要在构造函数中设置成员,或通过属性进行分配。
顺便说一下,你可以使用ToString重载来清理那个DateTime代码。
string CaptureTime = DateTime.Now.ToString("your format");