Не могли бы вы объяснить разницу между типами 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);
}
}
Ответ 5
Ответ 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.
Ответ 8
Простой поиск даст много информации в сети.
разница между неявным и явным типом
Ответ 9
Явно из MSDN -
Если операция преобразования может вызвать исключения или потерять информацию, вы должны отметить его явно. Это предотвращает бесшумный компилятор вызывая операцию конверсии с возможным непредвиденным последствия.
Неявно из MSDN -
если преобразование гарантировано не приведет к потере данных