В чем разница между явным и неявным типом приведения?

Не могли бы вы объяснить разницу между типами explicit и implicit?

Ответ 1

Это немного сложно, потому что синтаксис "cast" на С# действительно делает ряд разных вещей (cast, примитивный конвертировать, сделанный на заказ конверт и т.д.)

В неявном литье существует очевидное преобразование, сохраняющее ссылку между ними:

List<int> l = new List<int>();
IList<int> il = l;

Компилятор может доказать, что это безопасно только из статического анализа (List<int> всегда IList<int>)

С явным литом, либо вы сообщаете компилятору, что вы знаете больше, чем он делает - "пожалуйста, поверьте мне, но все равно проверьте":

List<int> l = new List<int>();
IList<int> il = l;
List<int> l2 = (List<int>)il;

Хотя этот прилив возможен, компилятор не согласится с тем, что все IList<int> на самом деле List<int> - поэтому мы должны сказать ему, чтобы он разрешил его.


В неявном примитивном преобразовании (предоставляемом спецификацией языка) обычно считается, что существует безопасное, не рискованное, не потерянное (оговорка: см. комментарий Джона):

int i = 1;
float f = i;

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

float f = 1;
int i = (int)f;

С заказными операторами все ставки отключены, и вам придется посмотреть документацию. Это может быть ссылка, или это может быть что угодно. Он может следовать аналогичным правилам для примитивных преобразований (пример: decimal), или он может делать что угодно случайным образом:

XNamespace ns = "http://abc/def"; // implicit
XAttribute attrib = GetAttrib();
int i = (int)attrib; // explicit (extracts text from attrib value and
                     // parses to an int)

Оба эти запускают настраиваемый код, специфичный для контекста.

Ответ 2

Какая разница между Президентом Соединенных Штатов и Президентом Канады?

Поскольку президента Канады нет, трудно ответить на этот вопрос. Правильная вещь - отойти назад и попросить разъяснить вопрос. "Президент Канады" спрашивает ли королева (церемониальный глава государства), генерал-губернатора (который может налагать вето на счета) или премьер-министра (который фактически выступает в качестве исполнительной власти) или что-то еще? Трудно сказать без пояснений.

И даже с разъяснением, это неопределенный вопрос. Какие отличия вы хотите знать?

Так как в С# нет такой вещи, как "неявный бросок", сложно ответить на ваш вопрос. В С# кастинг - это оператор. Поэтому я вернусь к нему.

Вы хотели спросить: "Какая разница между явным преобразованием и неявным преобразованием?" Или вы хотели спросить о семантике литого оператора? Или разница между оператором литья и операторами преобразования другого типа? Или ситуации, в которых операторы литья могут "неявно" вставляться в ваш код компилятором? (Например, цикл foreach и оператор + = могут как неявно вставлять невидимый листинг.)

Вы можете уточнить вопрос? Какие две вещи вы просите сравнить и какие различия вас интересуют?

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

Ответ 3

int i = 2;

float a = i;        // Implicit
float b = (float)i; // Explicit

Ответ 4

Явные конверсии

Если преобразование невозможно сделать без риска потери информации, необходимо выполнить явное преобразование.

Например -

class ExplicitConversions
{
    static void Main()
    {
        int x;
        double y = 6358.057;
        // Cast double to int.
        x = (int)y;
        System.Console.WriteLine(x);
    } 
}

Неявные преобразования

Если преобразование можно сделать без риска потери информации, необходимо выполнить явное преобразование. Никакой специальный синтаксис не требуется, поскольку преобразование безопасно по типу и никакие данные не будут потеряны.

Например -

class ImplicitConversions
{
    static void Main()
    {
        int x = 6714;
        double y;
        // Cast int to double.
        y = x;
        System.Console.WriteLine(y);
    } 
}

Ответ 6

Я думаю, что это сообщение объясняет это лучше всего.

Ответ 7

Явный листинг:

int x = 0;
float y = 3.8f;

x += (int) y; //Explicit cast.

Это говорит компилятору, что бросок был преднамеренным и что вы знаете, что дробная часть будет потеряна. Компилятор не будет жаловаться.

Неявный перевод:

int x = 0;
float y = 3.8f;

x += y; //Implicit cast

Компилятор будет жаловаться, потому что дробная часть будет потеряна при преобразовании float в int.

Ответ 9

Явно из MSDN -

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

Неявно из MSDN -

если преобразование гарантировано не приведет к потере данных