根据标题,C#.Net是否提供任何隐式转换器,或者是我们开发人员定义的唯一隐式转换器?
我认为以下可能是一个很好的用例,例如:
var myObject = new object();
String myString = myObject;
或者,事实上,大多数类型都被分配到string
。
答案 0 :(得分:7)
有很多理由说明为什么不允许这样的自动转换(开始时信息丢失)。
通常会导致做错事(例如,容易调用错误的重载):这违背了“成功之坑”的想法。
作为一个例子,如果您可以自由地将任何内容转换为string
,那么这将始终在编译时和运行时工作:
int GetIntOrZero(string value) {
Int32.TryParse(value, out int res);
return res;
}
var myObj = new MyType(args);
var count = GetIntOrZero(myObj);
像GetIntOrZero
这样的函数在处理输入时经常作为帮助器存在,但将它应用于任意对象是没有意义的。
答案 1 :(得分:2)
嗯,当然有一些明显的:
if (input.trim().isEmpty()) {
// Do something if the input was empty or had just whitespaces
}
尽管如此,我想提出type safety的论点,以反对经常使用隐含的开箱即用转换。
@Richard在答案中指出,输入安全措施防范常见/容易犯错误。
另一个例子;想象一下//object
//any_type -> object [note: one way]
object o = some_instance_of_a_type;
//numerics...
//int -> double [note: one way]
int i = 75;
double d = i;
//some more? there always are.
的隐式转换,那么这个结果会是什么?
int<->double
除此之外,你的字符串示例在这个意义上是有意义的,即有很多专门为该任务设计的重载。
例如;
double d = 75.5;
int i = d;
d = i; //what would d be?
所以,我想说,在这个时刻,明确需要定义转换,你将获得两者中最好的。