C# 自定义隐式强制转换与公共属性

C# 自定义隐式强制转换与公共属性,c#,properties,casting,C#,Properties,Casting,好的,我有一个顶级类,用于监视一组不同的值,范围从值类型到引用类型。现在我的问题是,为顶级类设置隐式强制转换与设置公共属性有什么区别 一些代码来说明 这: 与之相比: public int DataLevel3Value { get { return this.DataLevel1.DataLevel2.DataLeverl3.Data; } } 与属性版本相比,我不想使用隐式版本有什么原因吗?下面的代码也有效吗 (TP == 1

好的,我有一个顶级类,用于监视一组不同的值,范围从值类型到引用类型。现在我的问题是,为顶级类设置隐式强制转换与设置公共属性有什么区别

一些代码来说明

这:

与之相比:

 public int DataLevel3Value
 {
      get
      {
          return this.DataLevel1.DataLevel2.DataLeverl3.Data;
      }
 }
与属性版本相比,我不想使用隐式版本有什么原因吗?下面的代码也有效吗

 (TP == 10) == (TP.DataLevel3Value == 10) == true;

我确实意识到隐式转换的可能性带来了可读性的轻微缺乏,但是这是一个只有一个其他程序员的小项目。我们只是好奇是否有严重的缺陷会抑制我们所缺少的程序的功能。

绝对不要这样写隐式强制转换。隐式强制转换保留用于从一种类型转换为另一种类型时不会丢失数据的情况。从:

implicit关键字用于声明隐式用户定义的类型转换运算符。如果保证转换不会导致数据丢失,则可以使用它启用用户定义类型与另一类型之间的隐式转换

在您的示例中,它确实会导致信息丢失。这显然是一个更好的选择


你提到它降低了可读性,你完全正确。在绝大多数情况下,您应该倾向于提高可读性,而不是仅仅允许您使用更少字符编写代码的语法糖,而不管项目大小

我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。哦,很抱歉,我们甚至没有意识到代码是一个有效的布尔表达式,其计算结果应为
true
。虽然最后的
==true
是多余的。哦,我知道多余的
==true
我确保所有的评估结果都是
true
,仅此而已。我假设这是基于丢失特定演员的信息,ala从一个引用类型到另一个引用类型,而不是从引用类型到值类型。这两种情况都适用吗?在这种情况下,我相信你已经回答了这个问题。好的,谢谢,我会在可能的时候发布这个作为答案,我们只是想澄清一下,这一切都是有意义的。@Nomad101你正在从一个复杂的引用类型转换成一个
int
,所以你当然失去了这里的信息。实际上,您几乎不需要编写隐式转换。我们只是在想,因为底层代码基本上是完全相同的,对于返回int之类的东西来说,这是很好的。因为属性和隐式转换的代码中唯一的区别是使用
this
关键字,而不是
TP
@Nomad101在这种情况下,您可能应该使用一个接口。类似于
IIntResult{int IntValue{get;}}
的东西,您可以在
TopLevel
中实现。然后,您可以在
int
周围定义一个最小的包装器,它也实现了这一点,只返回
int
s。您可以进行从
int
到该包装类的隐式转换(尽管这可能不是必需的)。
 (TP == 10) == (TP.DataLevel3Value == 10) == true;