В c # может ли конструктор выполнять неявное приведение между разными типами в некоторых сценариях?

#c# #constructor

#c# #конструктор

Вопрос:

В c #, может ли конструктор выполнять неявное приведение во время выполнения между разными типами в некоторых сценариях? Например, из типа ‘System.Введите’ для некоторых объектов или приведите некоторый объект к его родительскому объекту или из ‘int’ в ‘double’?

Комментарии:

1. На самом деле компилятор делает это во время компиляции, добавляя явные приведения за кулисами.

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

3. Я не понимаю вашего вопроса. Можете ли вы предоставить какой-нибудь пример кода, чтобы показать, что вы имеете в виду?

4. Вы говорите о неявных преобразованиях . Приведение не играет никакой роли, что вызывает явное преобразование. Существует неявное преобразование из int в double, возможное, потому что все возможные значения int также могут быть сохранены в double . Компилятор автоматически генерирует код для выполнения преобразования. Но не наоборот, для этого требуется (int)doubleValue . Явный. Также ничего общего с конструктором. Система. Тип имеет очень мало неявных преобразований, только для базового класса или интерфейса. Итак, MemberInfo, _Type и IReflect . И System. Object, универсальный базовый класс.

Ответ №1:

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

Пример (источник):

 using System;
public class C 
{
    public void M() 
    {
        int num = 1;
        var f = new Foo(num);
    }
}

public class Foo
{
    public Foo(double a)
    {

    }
}
  

Сгенерированный компилятором код:

 public class C
{
    public void M()
    {
        int num = 1;
        Foo foo = new Foo((double)num);
    }
}
public class Foo
{
    public Foo(double a)
    {
    }
}