C# 我可以像分配int或string一样分配类型吗

C# 我可以像分配int或string一样分配类型吗,c#,declaration,C#,Declaration,假设我创建了一个类Number。有没有一种方法可以像分配int或string那样分配这种类型的变量 Number n1 = 123; Number n2 = "123"; 我不介意有一个构造函数来处理这些声明中的任何一个,只要我可以这样写。如果您这样声明一个声明,那么您想要使用的语法可以工作: public class Number { public static implicit operator Number(int i) => /* create and

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

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

我不介意有一个构造函数来处理这些声明中的任何一个,只要我可以这样写。

如果您这样声明一个声明,那么您想要使用的语法可以工作:

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

    //...
}
现在赋值
编号n=12将调用此操作员

但使用时要小心,如果在您没有预料到的情况下调用运算符,则可能会产生副作用。

隐式强制转换运算符只应在没有信息丢失的情况下使用(因此存在从
int
double
的隐式转换,但只有从
double
int
的显式转换)。

对于用户定义的类型,不能重载赋值运算符
=
,比如你的
号码
班级。但是,您可以使用构造函数方法,您可以使用用户定义的转换运算符。看起来是这样的:

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

    //...
}
公共类编号
{
私有整数实际值;
公共编号(int值)=>\u实际值=值;
//用户定义的转换运算符
//从int开始
公共静态隐式运算符编号(int值)
=>新编号(值);
//从字符串
公共静态隐式运算符编号(字符串值)
{
如果(!int.TryParse(值,out _实际值))
{
//格式无效,无法分析
//抛出异常,或设置_actualValue=0
}
}
}
要使用它:

//来自int
编号=(编号)123;
//从字符串
编号=(编号)“123”;
//您可以排除显式“(数字)”强制转换

有关用户定义的转换操作的更多信息,请参见此处:

使用隐式运算符,您不再需要显式转换。啊,是的,谢谢。用代码中的注释更新了答案。你能给我一个意外调用运算符的示例吗?我自己找不出一个。@Daniel假设您有两种方法
WriteToLog(数字n)
WriteToLog(int I)
。出于某种原因,您可以删除第二个,但所有调用(如
WriteToLog(12)
)仍将编译。这当然是一个虚构的例子,我不知道你想用它来做什么。我只是想说可能会有陷坑。