Вопрос

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

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(); 
    }
}
Это было полезно?

Решение

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

string d = new Fred();

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

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

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

 string d = new Fred(); 

вы хотите

var b = new Fred();

иметь тип fred, и

var c = new Fred();

иметь строковый тип?Хотя декларации идентичны?

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

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

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

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