【问题标题】:Can somebody explain the parts of this syntax, and how it would be used?有人可以解释这种语法的各个部分,以及如何使用它吗?
【发布时间】:2012-06-27 20:50:42
【问题描述】:

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

((IDisposable)foo).Dispose();

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

【问题讨论】:

  • 您可能想知道为什么在调用 Dispose 之前需要强制转换,因为您可能已经静态地知道 fooIDisposable。如果foo的,类型显式实现了IDisposable,那么就不能直接调用foo.Dispose(),需要先做这个转换。 msdn.microsoft.com/en-us/library/ms173157.aspx(@EugenRieck 的回答回答了语法,这是主要部分,我认为这更适合作为评论)
  • 为了进一步扩展@TimS 的评论,该对象也不一定在您正在转换的对象的继承链中,因为自定义显式或隐式转换运算符可以允许您转换为/从完全不相关类型(尽管它有限制,例如不允许使用接口)。

标签: c# syntax parentheses


【解决方案1】:
  • foo开头
  • 前缀(IDisposable) 将其转换为请求的接口
  • 把它放在括号中告诉.net foo 是要转换的东西,而不是foo.Dispose() 的结果
  • 现在添加.Dispose()来寻址接口的方法

【讨论】:

  • +1 关键字:cast
  • 会不会一直是foo前面括号内的接口?
  • 不,你可以投射到任何类型的对象
  • @jaykreeler 不,它不需要是一个接口(但它经常是)。它可以是任何东西,foo 可以转换为。
  • @EugenRieck 并且由于自定义显式/隐式转换运算符,foo 可以转换为的内容并不总是在其继承链中可见。
【解决方案2】:

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

Object foo = new Object();
IDisposable ID;

现在ID = foo 会报错,但ID = (IDisposable)foo 会起作用。

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

【讨论】:

    【解决方案3】:

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

    这...

    ((IDisposable)foo).Dispose(); 
    

    和这个一样……

    IDisposable i = (IDisposable)foo; 
    i.Dispose();
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        语法:

        var d = (IDisposable)foo;
        

        称为显式转换。

        语法:

        ((IDisposable)foo).Dispose(); 
        

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

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

        您可以在其他形式中看到这种行为:

        (foo as IDisposable).Dispose();
        

        或者:

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

        我的第一个示例使用as 运算符以与您自己的强制转换(内联)相同的方式进行强制转换。我的第二个示例设置了一个变量 s,然后再针对 null 进行测试。

        我的意思是,如果不使用括号来定义边界,这些都无法编译。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 1970-01-01
          • 2011-04-01
          • 2021-04-28
          • 1970-01-01
          • 1970-01-01
          • 2020-04-20
          相关资源
          最近更新 更多