Dispose方法不允许对象参与C#中的使用。为什么?

问题描述 投票:0回答:2

Dispose方法不允许对象参与C#中的使用。为什么?

根据通过C#CLR

如果将动态表达式指定为foreach语句中的集合或指定为using语句,编译器将生成尝试将表达式强制转换为非通用System.IEnumerable接口或System.IDisposable接口。如果强制转换成功,则使用表达式,并且代码可以正常运行。如果强制转换失败,Microsoft.CSharp.RuntimeBinder.RuntimeBinderException异常被抛出。

因此,我正在尝试以下操作:

using System;

namespace myprogram
{
    delegate void VoidRes();
    class Program
    {
        static void Main(string[] args)
        {

            dynamic a = new
            {
                Dispose = new VoidRes
                (
                    delegate () { Console.WriteLine("in Dispose"); }
                )
            };

            using(a) {
                Console.WriteLine("foo");
            }
        }
    }
}

我收到一个错误:

未处理的异常。 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型“ <> f__AnonymousType4”隐式转换为“ System.IDisposable”在CallSite.Target(Closure,CallSite,Object)在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet](CallSite网站,T0 arg0)

这很奇怪,因为我认为为了满足IDisposable接口,就可以实现Dispose方法(正是我在匿名类型中所做的事情。)。

我在这里想念什么?

c# .net dynamic idisposable anonymous-types
2个回答
2
投票

足以实现IDisposable,但是它并没有在代码中的任何地方发生。通过创建类/结构并显式指示接口类型,可以完成C#中的接口实现。一个对象具有相同的成员(属性,方法等)来匹配接口是不够的。 (这种行为称为鸭子输入,并且以其他一些语言存在。)


2
投票

您的匿名类型不实现IDisposable接口,只是因为它具有IDisposable接口所具有的方法。匿名类型cannot

© www.soinside.com 2019 - 2024. All rights reserved.