В приведенном ниже коде, когда я пытаюсь получить значение по умолчанию для необязательного параметра, тип которого является пользовательским типом значения, я получаю значение null. Для меня это не имеет смысла, поскольку значение null не является допустимым значением типа Bar.
public static void Main()
{
var ctor = typeof(Foo).GetConstructors().First();
foreach (var paramInfo in ctor.GetParameters())
{
Console.WriteLine(paramInfo);
Console.WriteLine(paramInfo.HasDefaultValue);
Console.WriteLine(paramInfo.DefaultValue ?? "[default value is null]");
Console.WriteLine(paramInfo.RawDefaultValue ?? "[default value is null]");
Console.WriteLine();
}
}
public class Foo
{
public Foo(int intVal1 = 3, int intVal2 = default, Bar barVal = default)
{
}
}
public struct Bar
{
public string Value;
public Bar(string value) { Value = value; }
public Bar() : this("default constructor") { }
public override string ToString() =>
Value == null ? "Bar [value is null]" : $"Bar: {Value}";
}
Код выводит следующее:
Int32 intVal1
True
3
3
Int32 intVal2
True
0
0
Bar barVal
True
[default value is null]
[default value is null]
Вместо «[значение по умолчанию равно нулю]» я бы ожидал «Бар [значение равно нулю]».
Во-первых, это ошибка в .NET? Во-вторых, как мне получить значение по умолчанию? Код ниже, кажется, работает для этого случая, но я не знаю, доверять ли ему, потому что я не знаю, соответствует ли мое предположение paramInfo.HasDefaultValue && paramInfo.ParameterType.IsValueType && paramInfo.DefaultValue == null охватывает все случаи, когда мне нужно использовать GetDefaultValueOfType.
public static object? GetDefaultParameterValue(ParameterInfo paramInfo)
{
if (paramInfo.HasDefaultValue)
{
var defaultValue = paramInfo.DefaultValue;
if (paramInfo.ParameterType.IsValueType && defaultValue == null)
{
// Seems to happen for custom structs.
// I don't know why this happens; is it a bug in .NET?
}
else
{
return defaultValue;
}
}
return GetDefaultValueOfType(paramInfo.ParameterType);
}
public static object? GetDefaultValueOfType(Type type)
{
if (type.IsValueType)
{
return typeof(ParameterVM)
.GetMethod(nameof(GetDefaultValueOfTypeGeneric))
.MakeGenericMethod(type)
.Invoke(null, null);
}
return null;
}
public static T GetDefaultValueOfTypeGeneric()
{
return default;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... -parameter
ПараметрInfo.DefaultValue имеет значение null для необязательного параметра типа значения [дубликат] ⇐ C#
Место общения программистов C#
1728053235
Anonymous
В приведенном ниже коде, когда я пытаюсь получить значение по умолчанию для необязательного параметра, тип которого является пользовательским типом значения, я получаю значение null. Для меня это не имеет смысла, поскольку значение null не является допустимым значением типа Bar.
public static void Main()
{
var ctor = typeof(Foo).GetConstructors().First();
foreach (var paramInfo in ctor.GetParameters())
{
Console.WriteLine(paramInfo);
Console.WriteLine(paramInfo.HasDefaultValue);
Console.WriteLine(paramInfo.DefaultValue ?? "[default value is null]");
Console.WriteLine(paramInfo.RawDefaultValue ?? "[default value is null]");
Console.WriteLine();
}
}
public class Foo
{
public Foo(int intVal1 = 3, int intVal2 = default, Bar barVal = default)
{
}
}
public struct Bar
{
public string Value;
public Bar(string value) { Value = value; }
public Bar() : this("default constructor") { }
public override string ToString() =>
Value == null ? "Bar [value is null]" : $"Bar: {Value}";
}
Код выводит следующее:
Int32 intVal1
True
3
3
Int32 intVal2
True
0
0
Bar barVal
True
[default value is null]
[default value is null]
Вместо «[значение по умолчанию равно нулю]» я бы ожидал «Бар [значение равно нулю]».
Во-первых, это ошибка в .NET? Во-вторых, как мне получить значение по умолчанию? Код ниже, кажется, работает для этого случая, но я не знаю, доверять ли ему, потому что я не знаю, соответствует ли мое предположение paramInfo.HasDefaultValue && paramInfo.ParameterType.IsValueType && paramInfo.DefaultValue == null охватывает все случаи, когда мне нужно использовать GetDefaultValueOfType.
public static object? GetDefaultParameterValue(ParameterInfo paramInfo)
{
if (paramInfo.HasDefaultValue)
{
var defaultValue = paramInfo.DefaultValue;
if (paramInfo.ParameterType.IsValueType && defaultValue == null)
{
// Seems to happen for custom structs.
// I don't know why this happens; is it a bug in .NET?
}
else
{
return defaultValue;
}
}
return GetDefaultValueOfType(paramInfo.ParameterType);
}
public static object? GetDefaultValueOfType(Type type)
{
if (type.IsValueType)
{
return typeof(ParameterVM)
.GetMethod(nameof(GetDefaultValueOfTypeGeneric))
.MakeGenericMethod(type)
.Invoke(null, null);
}
return null;
}
public static T GetDefaultValueOfTypeGeneric()
{
return default;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79054435/parameterinfo-defaultvalue-is-null-for-optional-value-type-parameter[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия