Почему этот string.Format() не возвращает строку, а динамическую?
@{
ViewBag.Username = "Charlie Brown";
string title1 = string.Format("Welcome {0}", ViewBag.Username);
var title2 = string.Format("Welcome {0}", ViewBag.Username);
}
В представлении MVC я использую следующие значения:
@Html.ActionLink(title1, "Index")
@Html.ActionLink(title2, "Index")
Здесь title1
работает нормально. Но ошибка title2
ActionLink завершилась с ошибкой компилятора:
CS1973: "System.Web.Mvc.HtmlHelper" не имеет применимого метода с именем "StandardHeader", но по этому имени имеет метод расширения. Методы расширения не могут динамически отправляться. Подумайте о том, как использовать динамические аргументы или вызывать метод расширения без синтаксиса метода расширения.
string.Format()
имеет довольно много перегрузок, но возвращаемый тип всегда строка. Почему объявление переменной, использующее var
, не работает здесь?
Ответы
Ответ 1
Хорошо, поэтому мы уже знаем из комментариев и других ответов, что проблема находится в dynamic
. Поскольку dynamic
привязан во время выполнения, только в это время выполняется разрешение перегрузки и выполняется проверка типа.
Итак: если хотя бы один из параметров dynamic
, разрешение перегрузки выполняется во время выполнения.
Вот почему эта очевидная ошибка разрешена:
dynamic x = "";
int i = string.Format("{0}", x);
Не беспокойтесь, если нет перегрузки string.Format
, которая возвращает int
. Он оценивает это позже.
Ответ 2
Сообщение об ошибке сообщает вам, что здесь не так:
Нельзя динамически отправлять методы расширения. Подумайте о том, как использовать динамические аргументы или вызывать метод расширения без синтаксиса метода расширения.
title2
имеет тип dynamic
. Вам нужно отдать его на string
, так как вы знаете, что это такое.
Ответ 3
Это сумка для просмотра, которая является динамичной.
![введите описание изображения здесь]()
Если вы используете фактическое имя пользователя (вместо ViewBag.UserName), оно будет работать.
Или добавьте (string)ViewBag.Username
в строку.