Я не уверен, в чем проблема. Я работаю с 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;
Я не буду подробно разбираться в том, почему я использую строки в этом конкретном ключе. Все работает нормально. Я предполагаю, что это имеет какое-то отношение к тому, что строка находится внутри другой строки? Это может быть совершенно очевидно, но я действительно понятия не имею. Любые идеи?
Нет, это не имеет никакого отношения к этому - это просто, что инициализаторы полей экземпляра не могут использовать другие поля экземпляра или методы экземпляра. Вот простой пример:
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");
DateTime.Now
был «медленным» помимо этого.
Ошибка сообщает вам, что именно происходит. Вы пытаетесь инициализировать поле экземпляра SaveFormat
со значением, которое зависит от поля экземпляра CaptureTime
, используя синтаксис инициализатора поля. Переместите инициализацию этих значений в конструктор уровня экземпляра, и все будет хорошо.
Кстати, сохраните DateTime.Now
во временном значении вместо повторного вызова, как вы сейчас. Что делать, если вы просматриваете границу даты во время выполнения кода? Тьфу.
В С# запрещено писать инициализаторы нестатического поля, которые ссылаются друг на друга, поскольку обычно порядок инициализации undefined.
Переместить инициализацию в конструктор вашего класса
И вам действительно лучше использовать String.Format или DateTime.Format(string) для форматирования даты.
Вам нужно установить член в конструкторе или назначить его через свойство.
Btw, вы можете очистить этот код DateTime, используя ToString перегружать.
string CaptureTime = DateTime.Now.ToString("your format");