Как 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.
Да, много страшных незнакомых слов, но информация по ним легко ищется с примерами кода.