Невозможно неявно преобразовать тип «X» в «строку» — когда и как он решит, что «не может»?

StackOverflow https://stackoverflow.com/questions/751303

  •  09-09-2019
  •  | 
  •  

Вопрос

Прямо сейчас я занимаюсь этим с Guidс.

Я конечно помню, что по всему коду где-то это неявное преобразование работает, где-то нет.До сих пор я не вижу закономерности.

Как компилятор решает, когда он не может?Я имею в виду метод типа Guid.ToString() присутствует, разве он не вызывается всякий раз, когда необходимо это преобразование?

Может кто-нибудь сказать мне, при каких обстоятельствах это преобразование выполняется автоматически и когда мне нужно позвонить myInstance.ToString() явно?

Это было полезно?

Решение

Короче говоря, когда определен неявный или явный оператор преобразования:

class WithImplicit {
    public static implicit operator string(WithImplicit x) {
        return x.ToString();}
}
class WithExplicit {
    public static explicit operator string(WithExplicit x) {
        return x.ToString(); }
}
class WithNone { }

class Program {
    static void Main() {
        var imp = new WithImplicit();
        var exp = new WithExplicit();
        var none = new WithNone();
        string s1 = imp;
        string s2 = (string)exp;
        string s3 = none.ToString();
    } 
}

Другие советы

Нет, неявного преобразования из GUID к String, так что это вообще не работает нигде в коде.

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

string id = "--" + guidValue + " : " + num;

Это может выглядеть как неявное преобразование из GUID к String, но это не так.Сгенерированный код на самом деле выглядит так:

string id = String.Concat(new object[] { "--", guidValue, " : ", num });

Все операнды приводятся к типу Object и помещен в массив.А String.Concat затем метод вызывает ToString метод для каждого элемента массива, чтобы получить для него строковое представление.

Единственное место, где вам фактически не нужно самостоятельно вызывать ToString(), — это объединение строк.

Guid g;
int i;
string s = "Hello "+g+' '+i;

Кроме того, в некоторых ситуациях вызов выполняется .NET Framework, например в Строка.Формат().

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top