Класс неявных преобразований - PullRequest
0 голосов
/ 14 мая 2009

Я знаю, что могу использовать неявные преобразования с классом следующим образом, но есть ли способ получить экземпляр для возврата строки без преобразования или преобразования?

public class Fred
{
    public static implicit operator string(Fred fred)
    {
        return DateTime.Now.ToLongTimeString();
    }
}

public class Program
{
    static void Main(string[] args)
    {
        string a = new Fred();
        Console.WriteLine(a);

        // b is of type Fred. 
        var b = new Fred(); 

        // still works and now uses the conversion
        Console.WriteLine(b);    

        // c is of type string.
        // this is what I want but not what happens
        var c = new Fred(); 

        // don't want to have to cast it
        var d = (string)new Fred(); 
    }
}

Ответы [ 4 ]

8 голосов
/ 14 мая 2009

Фактически, компилятор будет неявно приводить Fred к string, но, поскольку вы объявляете переменную с ключевым словом var, компилятор не будет знать о вашем действительном намерении. Вы можете объявить вашу переменную как строку и получить значение, неявно приведенное к строке.

string d = new Fred();

Говоря иначе, вы могли бы объявить дюжину неявных операторов для разных типов. Как вы ожидаете, что компилятор сможет выбирать между одним из них? По умолчанию компилятор выберет фактический тип, поэтому ему вообще не придется выполнять приведение.

1 голос
/ 14 мая 2009

хочешь

var b = new Fred();

относится к типу fred, а

var c = new Fred();

иметь тип string? Даже если декларации идентичны?

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

1 голос
/ 14 мая 2009

С неявным оператором (который у вас есть) вы должны просто иметь возможность использовать:

 string d = new Fred(); 
0 голосов
/ 14 мая 2009

К сожалению, в этом примере c равен типа Fred. В то время как Фреды могут быть приведены к строкам, в конечном счете, с является Фредом. Чтобы заставить d в строку, вы должны сказать ему, чтобы привести Фред в виде строки.

Если вы действительно хотите, чтобы c была строкой, почему бы просто не объявить ее как строку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...