【问题标题】:What is the (type) in (type)objectname.var(type)objectname.var 中的 (type) 是什么
【发布时间】:2011-03-11 03:06:28
【问题描述】:

我正在浏览一本关于 C# 的书,并且遇到了一些我似乎无法查找的东西,因为我不知道它叫什么,或者试图通过描述来搜索。

能否向我解释发生了什么,或者 (type) 背后的含义,在 (int)objectname.variablename 中对对象的引用之前?

这似乎是在向我投射。

编辑: 因为当我只是猜测并且需要更多代码时,你们中的大多数人都会放弃“我的”对演员表的引用,所以我包括了我正在审查的导致这个问题的代码。我在质疑 (int)numericupDown1.Value 中的 (int);

private void numericUpDown1_ValueChanged(object sender, EventArgs e) 
{
    dinnerParty.NumberOfPeople = (int)numericUpDown1.Value;
    DisplayDinnerPartyCost();
}

【问题讨论】:

  • 我不明白...I can't seem to look up, because I don't know what it is called ... It seems like casting to me。您是否尝试搜索c# casting?我还尝试搜索type parentheses,第二个和第三个结果解决了它。
  • 我刚刚尝试了您的建议(这与我的查询结果相同 - 不,我没有看到他们如何解决我的问题。

标签: c# casting


【解决方案1】:

它正在转换,它试图在运行时将变量名转换为类型(类型)

【讨论】:

  • 具体来说,它是显式转换,(与隐式转换相比)。显式:msdn.microsoft.com/en-us/library/xhbhezf4(v=VS.80).aspx 隐式:msdn.microsoft.com/en-us/library/z5z9kes2(v=VS.80).aspx
  • @David:不,这是明确的转换。您将显式和隐式转换与显式和隐式 conversion 混淆了。隐式 casts 在 C# 中极为罕见;人们唯一经常遇到隐式使用强制转换运算符的情况是在 foreach 循环中。
  • @pghtech,如果您已经在 C 或 C++ 中进行过“C 样式类型转换”,或者在 Java 中进行过转换,那么您已经对此相当熟悉了。我不是语言律师来保证相同的语义,但 C# 转换类似于 Java。
  • @Eric 感谢您的澄清! PS:我喜欢看你的博客。
【解决方案2】:

你是对的。它正在铸造。

【讨论】:

    【解决方案3】:

    在不知道所涉及的类型的情况下,很难准确地说出发生了什么。

    强制转换将显式调用从一种类型到另一种类型的转换运算符: http://msdn.microsoft.com/en-us/library/ms173105(VS.80).aspx

    然而,它可能是拆箱或显式装箱。装箱/拆箱是一种在堆上存储值类型的昂贵方式。 http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

    【讨论】:

      【解决方案4】:

      它将 numericUpDown1.Value 转换(转换)为 int 值。这也可以使用

      Convert.toInt32(numericUpDown1.Value)
      

      我假设dinnerParty.NumberOfPeople 是一个整数值,因此如果您不强制转换,如果提供的值不是整数,则会引发错误。例如,如果提供的 Value 是一个双精度值或一个字符串,它会抛出一个错误,通过强制转换它会将双精度值转换为 20.5 到 20 并且它会被接受。对于字符串,它取决于字符串中是否包含数字。如果字符串是“12”,那么使用上面提到的转换方法会将其转换为整数 12。

      【讨论】:

      【解决方案5】:

      正如 Eric Lippert(C# 的设计者之一)在其他地方的评论中提到的,这是 Conversion - 从一种类型转换为另一种类型。

      这不是铸造。强制转换是 C 中遗留下来的概念,有时编译器不知道某些东西是什么类型。强制转换是给编译器如何解释变量的信息。

      【讨论】:

      • 我同意这更像是一个遗留术语,但它仍然是 C# 程序员指南中使用的术语。从我在回答中包含的链接中:“数据类型之间的转换可以使用强制转换显式完成,但在某些情况下,允许隐式转换。”
      • 不,原来的海报实际上是铸造的。我试图(但显然失败)在这里指出的不同之处在于转换是句法,它是使用cast 运算符。转换是语义的,它是类型代数中的操作。 (syntactic) cast 表示用户希望发生一些转换。该转换可以是隐式转换或显式转换,可以是表示保留或表示更改。
      • 通常情况下,作为句法元素的演员表直接出现在代码中。但是,在极少数情况下,编译器会以您的名义静默插入强制转换运算符来执行显式转换。最常见的是“foreach(Giraffe g in myAnimals)”——很多人认为这相当于“过滤掉老虎”,但实际上它的意思是“在每一个出来的东西上加上一个强制转换运算符并抛出一个异常如果显式转换失败。”
      • 这是我的“有什么区别?”的一个很好的候选人。博客系列。 :-)
      • 好吧,我现在完全糊涂了。我认为在过去我们将拥有的称为“重新解释演员表”和实际转换之间存在区别。我opened a new question
      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 2011-10-03
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多