Как var переменную инициализировать выборным типом?

int? value = null;
var user = value ?? "Не введено";
Console.WriteLine(user);

Не могу додумать как реализовать: Создаётся неявно типизированная переменная и инициализируется типом в зависимости от значения другой переменной. Если value null то переменная String, если какое то целочисленое значение, то станет int. Выдаёт ошибку. Но не могу понять где нужно явно привести к типу. Оператор "??" невозможно применить к операнду типа "int?" и "string".


Ответы (2 шт):

Автор решения: Chaos_Sower

Смотрите, вам нужно различать 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#.

→ Ссылка
Автор решения: Alexander Petrov

Я вижу три альтернативы:

  1. Использовать общий тип (в данном случае object) и паттерн-матчинг (сопоставление с образцом).
  2. Сделать класс принимающий несколько типов (int, string) или иерархию классов на каждый тип (ООП на всю катушку).
  3. Перейти на язык, в котором есть discriminated union (размеченное объединение), например, F#. В C# это можно неуклюже реализовать на классах. См. например, библиотеку OneOf. См. также монады Either, Maybe.

Да, много страшных незнакомых слов, но информация по ним легко ищется с примерами кода.

→ Ссылка