是否有任何隐含的转换器'开箱即用'用C#.Net?

时间:2017-11-19 10:42:18

标签: c# .net implicit-conversion

根据标题,C#.Net是否提供任何隐式转换器,或者是我们开发人员定义的唯一隐式转换器?

我认为以下可能是一个很好的用例,例如:

var myObject = new object(); String myString = myObject;

或者,事实上,大多数类型都被分配到string

2 个答案:

答案 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?

所以,我想说,在这个时刻,明确需要定义转换,你将获得两者中最好的。