У меня есть свой собственный тип данных как
public class AppIdentiy
{
public string ID { get; set; }
public static implicit operator AppIdentiy(string userID)
{
var result = new AppIdentiy()
{
ID = userID
};
return result;
}
public static implicit operator string(AppIdentiy identity)
{
if (identity is null)
return string.Empty;
else if (string.IsNullOrEmpty(identity.ID))
return string.Empty;
return identity.ID;
}
//public static string operator +(AppIdentiy a) => a.ID;
}
Я использую этот AppIdentity, например, вот так
AppIdentiy myIdentity = "[email protected]";
string email = myIdentity; //setting the variable email with the value '[email protected]'
string comment = "this is user email address '" + myIdentity + "' generated by xyz app"; //this is not working, I am expecting here when I use '+' operator with my datatype its value should populate here like
«это адрес электронной почты пользователя [email protected], созданный приложением xyz»
Я не понимаю, как украсить перегрузку оператора + в моем классе AppIdentiy.
"AppIdentiy" - это опечатка? Должно ли это быть «AppIdentity»?
Ваша проблема не имеет ничего общего с перегрузкой операторов. В операции конкатенации строк, такой как "this is user email address '" + myIdentity
, компилятор автоматически вызывает метод ToString()
для любого элемента конкатенации, который еще не является строкой. Таким образом, будет вызван AppIdentity.ToString()
, который, поскольку он не переопределен, вернет реализацию по умолчанию, которая вместо этого возвращает имя типа. Чтобы получить желаемый результат, добавьте в свой класс AppIdentity следующее:
public override string ToString()
{
return ID;
}
В примере ОП неявное преобразование в string
уже происходит, поэтому ToString()
все равно никогда не вызывается.
Оператор +
принимает два операнда — левое и правое значения (хотя бы одно из которых должно быть объявляющего типа); следовательно, вы можете иметь любое или все:
public static string operator +(AppIdentiy x, string y) => ...;
public static string operator +(string x, AppIdentiy y) => ...;
public static string operator +(AppIdentiy x, AppIdentiy y) => ...;
Однако маловероятно, что вы действительно хотите здесь сделать это! Обычно вам не нужно переопределять способ сложения строк, и он уже работает так, как я ожидал для вашего типа.
Вы можете упростить свой неявный оператор до:
public static implicit operator string(AppIdentiy identity) => identity?.ID ?? String.Empty;
(он делает то же самое, что и ваш.)