В моей функции DefaultValue() есть что-то не так. Он ВСЕГДА возвращает false
, представляя, что структура НЕ является значением по умолчанию.Проверка значения по умолчанию для структуры
Почему это не работает?
[StructLayout(LayoutKind.Sequential)]
private struct ArrayItem
{
public long SrcSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 250)]
public string SrcFile;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 250)]
public string DestFile;
}
[StructLayout(LayoutKind.Sequential)]
private struct MyInfo
{
public int Count;
public int AppOne;
public int AppTwo;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100, ArraySubType = UnmanagedType.Struct)]
public ArrayItem[] Files;
}
private bool DefaultValue<T>(T structure)
{
if (EqualityComparer<T>.Default.Equals(structure, default(T)))
return true;
else
return false;
}
//Success returns 'Value Changed' as expected
MyInfo fileInfoOne = new MyInfo();
fileInfoOne.Count = 3;
fileInfoOne.Files = new ArrayItem[100];
fileInfoOne.Files[0].SrcSize = 100;
Debug.Write("fileInfoOne: ");
if (DefaultValue(fileInfoOne.Files[0])) Debug.WriteLine("Default Value."); else Debug.WriteLine("Value Changed.");
//Fails but has all the default settings, should return 'Default Value'
MyInfo fileInfoTwo = new MyInfo();
fileInfoTwo.Files = new ArrayItem[100];
fileInfoTwo.Files[0].SrcSize = 0;
fileInfoTwo.Files[0].SrcFile = "";
fileInfoTwo.Files[0].DestFile = "";
Debug.Write("fileInfoTwo: ");
if (DefaultValue(fileInfoTwo.Files[0])) Debug.WriteLine("Default Value."); else Debug.WriteLine("Value Changed.");
Прежде всего, выложенный код всегда выбрасывает NRE. Во-вторых, 'fileInfoTwo' не используется. –
@ ИванСтоев благодарит за это, +1 за помощь. Я исправил его и попробовал сам убедиться, что он скомпилирован и работает нормально. Я заметил, что он работает! Мое приложение IRL все равно возвращает false каждый раз. Я думаю, что это связано с тем, что я устанавливаю объект массива. Даже если я устанавливаю его со значениями по умолчанию, сама структура, возможно, не является дефолтом? –
Значения по умолчанию: 0 (ноль) для типов значений и 'null' для ссылочных типов. Если вы тестируете структуру MyInfo' с массивом, она никогда не будет использоваться по умолчанию (массив является ссылочным типом). –