C#和#x27;(类别)var';-这是什么结构

C#和#x27;(类别)var';-这是什么结构,c#,C#,我正在尝试学习一些C#,这是我发现使用的代码片段之一: (CheckBox)c (其中c是foreach的结果) 我知道它这样做是为了让编译器知道c将作为一个复选框,我的问题是:这种类型的构造叫什么?我希望能够通过谷歌更好地理解它 谢谢 它被称为“铸造”。 查看以了解更多信息: 它将c变量强制转换为type复选框。我认为在您的示例中,它是一个对象变量c,如果您随后将其转换为CheckBox,则可以访问所有属性,如“IsChecked”、“Name”等 换句话说 演员出演前: bool isI

我正在尝试学习一些C#,这是我发现使用的代码片段之一:

(CheckBox)c
(其中c是foreach的结果)

我知道它这样做是为了让编译器知道c将作为一个复选框,我的问题是:这种类型的构造叫什么?我希望能够通过谷歌更好地理解它

谢谢

它被称为“铸造”。 查看以了解更多信息:


它将c变量强制转换为type复选框。我认为在您的示例中,它是一个对象变量c,如果您随后将其转换为CheckBox,则可以访问所有属性,如“IsChecked”、“Name”等

换句话说

演员出演前:

bool isItChecked = c.IsChecked; // this would not compile because object does not have a property "IsChecked"
因此,要使其正常工作,我们必须告诉编译器变量c的类型如下:

var checkBoxC = (CheckBox)c; // The Cast
bool isItChecked = checkBoxC.IsChecked; // access the casted items properties.
是一个很好的类型转换初学者教程,您应该检查“显式转换”,因为这就是您正在做的

PS:这是必要的,因为c#是。

它被称为演员阵容。正如您所说,这里使用它来告诉编译器,
c
实际上是一个复选框。还有一个问题。在使用非泛型
IEnumerable
foreach
的情况下,我认为这就是您正在做的,还有两种方法可以避免这种循环体中的强制转换:

for (CheckBox c in xs) {
}

for (var c in xs.Cast<CheckBox>()) {
}
for(xs中的复选框c){
}
for(xs.Cast()中的变量c){
}

这两段代码现在都将
c
作为
复选框公开,消除了强制转换的需要。我可能会使用第一种,因为它是最惯用的方法(以及.NET1.1和Java中熟悉的方法)。

我们称之为
casting
。看见一些教程:和

您还有一个相关的东西,叫做
装箱和拆箱


您的示例所做的是让您知道
对象c
实际上是一个
复选框。这样,您可以访问
复选框的所有属性,这称为强制转换。当您知道在代码执行时“c”的类型将是复选框时,您可以执行此操作。但是,c可能不是复选框,在这种情况下,您将得到一个

事实上,C#提供了许多避免强制转换的构造,比如和

根据经验:只有当你真的无法避免时才使用铸造

它被称为“或”


理解两者之间的区别,尽管它们做的是相同的事情。

这叫@JesonPark,你还想要什么?这个问题是完全可以理解的。为了完整性:隐式强制转换也称为强制。与强制转换不同,这也是在编译时完成的
static private void TestBoxingAndUnboxing()
{
 int i = 123;
 object o = i; // Implicit boxing
 i = 456; // Change the contents of i
 int j = (int)o; // Unboxing (may throw an exception if the types are incompatible)
}

//this function is about 2*Log(N) faster
static private void TestNoBoxingAndUnboxing()
{
 int i = 123;
 i = 456; // Change the contents of i
 int j = i; // Compatible types
}