Подтвердить что ты не робот

Почему этот 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, не работает здесь?

4b9b3361

Ответ 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 в строку.