3

在浏览一些教程时,我遇到了这样的行:

((IDisposable)foo).Dispose();

忽略对 Idisposable 的具体引用。我很好奇为什么括号的设置方式以及它们包含/做什么。我确信这是一个非常简单的问题,但是由于这种语法的泛型,我一直无法通过搜索找到答案。非常感谢您的帮助,谢谢。

4

5 回答 5

3

第一组括号将其强制转换为 IDisposable 对象。例如

Object foo = new Object();
IDisposable ID;

现在ID = foo会给出一个错误,但ID = (IDisposable)foo会起作用。

第二组括号允许您访问 IDisposable 对象的方法和属性,在本例中为 Dispose() 方法。如果您输入它,您将看到只有在您将第二组括号括起来后,智能感知才会向您显示 IDisposable 对象的方法和属性。

于 2012-06-26T14:02:31.403 回答
2

语法:

var d = (IDisposable)foo;

称为显式强制转换。

语法:

((IDisposable)foo).Dispose(); 

显式转换foo为临时变量并Dispose对其进行调用(请注意,此处使用了临时变量但您看不到它,它是由编译器创建的)

括号告诉编译器操作的优先顺序。IDisposable在这种情况下,它表示在解析Dispose调用之前将变量转换为。因为之前已经完成,所以编译器现在知道解析Dispose类型为 的变量IDisposable

您可以以其他形式看到此行为:

(foo as IDisposable).Dispose();

或者:

string s = null;

while ((s = Console.ReadLine()) != null)
{
}

我的第一个示例as以与您自己的演员(内联)相同的方式使用运算符进行转换。我的第二个示例s在继续针对null.

我的观点是,如果不使用括号来定义边界,这些都不会编译。

于 2012-06-26T14:06:05.490 回答
2
  • 从...开始foo
  • 前缀它(IDisposable)以将其转换为请求的接口
  • 把它放在括号中告诉.net这foo是要转换的东西,而不是结果foo.Dispose()
  • 现在添加.Dispose()地址接口的一个方法
于 2012-06-26T14:00:04.990 回答
0

这只是转换为 IDisposable 时的一个捷径。

这个...

((IDisposable)foo).Dispose(); 

和这个是一样的……

IDisposable i = (IDisposable)foo; 
i.Dispose();
于 2012-06-26T14:03:10.077 回答
0

内部的括号IDisposable将其转换为强制转换,然后外部的括号确保强制转换发生在对 的调用之前Dispose()

于 2012-06-26T14:03:26.207 回答