Переназначение приведения слабо типизированной переменной

Учитывая, что в C# у нас может быть слабый тип var, который может быть любого типа, пока он не будет установлен, возможно ли иметь один и тот же тип изменения var в зависимости от вывода теста?

Например

var c = DBQuery.FindString("paramater", "data");

это вернет NULL, если запрос не удался, или строку, если он работает.

Из того, что я вижу, поскольку FindString имеет возвращаемый тип строки, var c печатается как строка, несмотря на то, что она равна нулю.

Есть ли способ отменить набор c, чтобы его можно было использовать для

var c = DBQuery.FindInt("parameter", "data2");

Спасибо


person Nodoid    schedule 13.07.2014    source источник
comment
var не слабый тип. который может быть любого типа, пока он не установлен --- это неправильно. msdn.microsoft.com/en-us/library/bb383973.aspx Локальная переменная с неявным типом является строго типизированной так же, как если бы вы сами объявили тип...   -  person zerkms    schedule 14.07.2014
comment
Чтобы расширить: var является неявным типом. Это в точности идентично явному указанию типа: var s = "foo" совпадает с string s = "foo". Компилятор определяет, какое значение вставлять вместо var во время компиляции.   -  person Daniel Mann    schedule 14.07.2014


Ответы (2)


Ключевое слово var указывает компилятору определить тип переменной из выражения в правой части оператора инициализации.

Ключевое слово, которое вы, вероятно, ищете, это dynamic. Тип является статическим, но объект динамического типа обходит проверку статического типа. В большинстве случаев он функционирует так, как если бы он имел тип объекта. Во время компиляции предполагается, что элемент, типизированный как динамический, поддерживает любую операцию.

В этом примере

dynamic c = "foo";
Console.WriteLine(test.GetType());

c = 2;
Console.WriteLine(test.GetType());

Вывод

System.String
System.Int32

Тем не менее, я предлагаю вам адаптировать свой код, чтобы избежать типа dynamic, главным образом потому, что вы теряете способность обнаруживать ошибки во время компиляции и возможность использовать IntelliSense.

Дополнительные ресурсы

Ключевое слово var: http://msdn.microsoft.com/en-us/library/bb384061.aspx
Ключевое слово dynamic: http://msdn.microsoft.com/en-us/library/dd264736.aspx

person Jämes    schedule 13.07.2014

Вы неправильно поняли ключевое слово var. Это не любой тип, пока он не установлен. Он по-прежнему статически типизирован.

Это означает: компилятор определит тип выражения в правой части присваивания, и это будет статически объявленный тип переменной.

Поскольку DBQuery.FindString объявлен как возвращающий string (нулевой или нет), объявление на 100% эквивалентно:

string c = DBQuery.FindString("parameter", "data");

То, что вы хотите сделать, невозможно в С#. Вы можете объявить переменную как object или dynamic, и код будет работать, но если вы сделаете это, вы потеряете всю справку времени разработки, такую ​​как IntelliSense (плюс падение производительности во время выполнения из-за приведения типов или динамического ввода).

person jods    schedule 13.07.2014
comment
Это просто вызывает вопрос, почему вы хотите использовать одну и ту же переменную для разных типов? Я чувствую запах проблемы XY. - person Daniel Mann; 14.07.2014
comment
Полностью согласен. В дополнение к моему ответу использование одного и того же имени переменной для двух разных вещей является плохим стилем кодирования. - person jods; 14.07.2014