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)
)仍将编译。这当然是一个虚构的例子,我不知道你想用它来做什么。我只是想说可能会有陷坑。