2013-07-22 4 views
2

Я научился использовать неявные операторы для своих классов.Неявный оператор для int?

Теперь я хочу сделать что-то вроде этого:

public static implicit operator string(int val) 
{ 
    return "The value is: " + val.ToString(); // just an nonsense example 
} 

Однако это не так. Компилятор говорит:

определяемые пользователем преобразования должны преобразовать в или из типа ограждающей

Как я могу обойти это?

Моя цель состоит в том, чтобы быть в состоянии выполнить такой код:

int x = 50; 
textbox1.Text = x; // without using .ToString() or casting 
+0

Почему это неправильно? По-моему, это совершенно правильно! –

+0

@ RomanoZumbé Я обновил свой вопрос. Когда я пытаюсь это сделать, компилятор говорит: «Преобразование, определяемое пользователем, должно быть преобразовано в или из закрывающего типа» – Kamil

+0

Вы не можете обойти это, потому что вы * должны * реализовать неявный оператор как статический метод в преобразованном классе и Конечно, вы не можете изменить реализацию System.Int32. –

ответ

6

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

Ошибка компилятора вы получите очень четко об этом:

определяемые пользователем преобразования должны преобразовать в или из типа ограждающей

Итак, что вы пытаетесь достичь здесь просто невозможно.
Ваш лучший вариант, вероятно, является методом расширения на int, который выполняет преобразование и возвращает string.

+0

Я понимаю это. Невозможно обойти это, чтобы получить такой же эффект? – Kamil

+0

@ Kamil: Вы не можете. Тем не менее, см. Последнее предложение в моем обновленном ответе для альтернативного подхода. –

+0

Я уже сделал. Я попытался свести к минимуму мой код и не записывать '.MyExtension()' всюду. Может быть, я напишу собственный класс и поместил бы это целое внутри. Благодарю. – Kamil

1

Вам необходимо добавить неявный оператор в качестве члена класса. Поскольку у вас нет контроля над классом int; невозможно добавить неявный оператор в класс int.

Вы можете либо написать обертку для int, либо создать новый метод расширения для прямого преобразования int в строку (которая уже определена как ToString()).

2

Возможно, вы захотите рассмотреть альтернативный подход.

Вы могли бы написать метод расширения на Control так:

public static class ControlExt 
{ 
    public static void SetText(this Control self, object obj) 
    { 
     self.Text = obj.ToString(); 
    } 
} 

Тогда ваш код станет:

int x = 50; 
textbox1.SetText(x); 

Было бы, конечно, работа с любого типа, а не только INTS:

textbox1.SetText(DateTime.Now); 
+0

Мне это нравится. Вы показали мне, насколько отстало мое мышление :) – Kamil

Смежные вопросы