我可以把一个类型当作int或字符串来赋值吗



假设我创建了一个类Number。有没有一种方法可以像处理int或字符串那样分配这种类型的变量?

Number n1 = 123;
Number n2 = "123";

我不介意有一个处理这些声明的构造函数,只要我能这样写。

不能为用户定义的类型(如Number类(重载赋值运算符=。但是,您可以使用构造函数方法,您可以使用用户定义的转换运算符。看起来是这样的:

public class Number
{
private int _actualValue;
public Number(int value) => _actualValue = value;
// User defined conversion operators
// From int
public static implicit operator Number(int value)
=> new Number(value);
// From string
public static implicit operator Number(string value)
{
if (!int.TryParse(value, out _actualValue))
{
// Invalid format, couldn't parse
// Throw exception, or set _actualValue = 0
}
}
}

使用它:

// From int
Number number = (Number)123;
// From string
Number number = (Number)"123";
// You can exclude the explicit "(Number)" cast

有关用户定义转换操作的详细信息,请点击此处:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/user-defined-conversion-operators

如果您像这样声明一个隐式强制转换运算符,那么您想要使用的语法就可以工作:

public class Number
{
public static implicit operator Number(int i) => /* create and return your Number instance */;
//...
}

现在分配Number n = 12;将调用此运算符。

但是要小心使用,在您没有预料到的情况下调用运算符可能会产生副作用。
只有在没有信息丢失的情况下才应使用隐式强制转换运算符(因此存在从intdouble的隐式转换,但只有从doubleint的显式转换(。

最新更新