Как var переменную инициализировать выборным типом?
int? value = null;
var user = value ?? "Не введено";
Console.WriteLine(user);
Не могу додумать как реализовать: Создаётся неявно типизированная переменная и инициализируется типом в зависимости от значения другой переменной. Если value null то переменная String, если какое то целочисленое значение, то станет int. Выдаёт ошибку. Но не могу понять где нужно явно привести к типу. Оператор "??" невозможно применить к операнду типа "int?" и "string".
Ответы (2 шт):
Смотрите, вам нужно различать var
(ключевое слово неявного указания типа данных) и object
(базовый тип).
var
в любом случае будет каким-либо из типов (string
, int
и т. д.), просто вы переложите работу по определению типа на компилятор. Это затрудняет читаемость кода для других программистов (да и для вас самих).
Если вам нужно, чтобы user
мог быть либо строкой, либо числом, то подойдёт следующее:
int? value = null;
object user = value == null ? "Не введено" : value;
Console.WriteLine(user.ToString());
Если вы всё же хотите использовать var
(но я не рекомендую), то вот:
int? value = null;
var user = value == null ? "Не введено" : value.ToString(); // тут можно спокойно заменить `var` на `string?`, ведь этот код не гарантирует какое-либо значение для `string`
Console.WriteLine(user);
Если вы хотите, чтобы user
точно был строкой, то вот подходящий код:
int? value = null;
string user = value == null ? "Не введено" : value.ToString() ?? "Не введено";
Console.WriteLine(user);
Тут дан хороший ответ про различия var
и object
: Разница между типами var и object в c#.
Я вижу три альтернативы:
- Использовать общий тип (в данном случае
object
) и паттерн-матчинг (сопоставление с образцом). - Сделать класс принимающий несколько типов (
int
,string
) или иерархию классов на каждый тип (ООП на всю катушку). - Перейти на язык, в котором есть discriminated union (размеченное объединение), например, F#. В C# это можно неуклюже реализовать на классах. См. например, библиотеку
OneOf
. См. также монадыEither
,Maybe
.
Да, много страшных незнакомых слов, но информация по ним легко ищется с примерами кода.