«int» и «string» являются встроенными типами. Вы не сможете сделать такой же, как он, без видимых полей. Тем не менее, вы можете сделать что-то, что выглядит и ведет себя почти так же, как встроенный тип.
Лучший пример - Nullable<T>
. Это обеспечивает обнуляемую версию всех типов значений и может быть назначена так же, как она встроена:
int? x = 0;
int? y = null;
Способ, которым это работает, Nullable<T>
отменяет явное и неявное приведение. Таким образом, вы можете назначить встроенный тип, например int, для пользовательского Nullable<int>
, а код в Nullable<int>.op_Implicit
прозрачно обрабатывает преобразование.
Вот полный пример:
public struct MyVariable
{
private int _intValue;
private string _stringValue;
public override bool Equals(object obj)
{
if (!(obj is MyVariable))
{
return false;
}
var y = (MyVariable) obj;
return _stringValue == y._stringValue && _intValue == y._intValue;
}
public override int GetHashCode()
{
return (_stringValue ?? _intValue.ToString()).GetHashCode();
}
public override string ToString()
{
return _stringValue ?? _intValue.ToString();
}
public static implicit operator MyVariable(string value)
{
return new MyVariable { _stringValue = value };
}
public static implicit operator MyVariable(int value)
{
return new MyVariable { _intValue = value };
}
public static bool operator==(MyVariable variable, string value)
{
return variable._stringValue == value;
}
public static bool operator ==(MyVariable variable, int value)
{
return variable._intValue == value;
}
public static bool operator !=(MyVariable variable, string value)
{
return variable._stringValue == value;
}
public static bool operator !=(MyVariable variable, int value)
{
return variable._intValue == value;
}
public static void Test()
{
MyVariable a = "This is my own custom variable!";
MyVariable b = 2976;
if (a == "Hello") { }
if (b == 10) { }
Console.WriteLine(a.ToString());
Console.WriteLine(a.ToString());
}
}