Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#为什么可以';“我通过了”;“基础”;参照接口?_C#_Oop_Interface_Ref - Fatal编程技术网

C#为什么可以';“我通过了”;“基础”;参照接口?

C#为什么可以';“我通过了”;“基础”;参照接口?,c#,oop,interface,ref,C#,Oop,Interface,Ref,我想知道为什么这是一个编译错误,以便更好地理解C语言 在我的代码中,我有一个从IDisposable派生的接口(IMyInterface)。我有另一个方法,它接受“ref IDisposable”类型的参数。但我不能将IMyInterface类型的成员变量传递给该方法。下面是我的示例代码: using System; namespace CompileErrorBaseInterface { public interface IMyInterface : IDisposable { }

我想知道为什么这是一个编译错误,以便更好地理解C语言

在我的代码中,我有一个从IDisposable派生的接口(IMyInterface)。我有另一个方法,它接受“ref IDisposable”类型的参数。但我不能将IMyInterface类型的成员变量传递给该方法。下面是我的示例代码:

using System;

namespace CompileErrorBaseInterface
{
    public interface IMyInterface : IDisposable { }

    class Program
    {
        private IMyInterface _myInterfaceObj;

        static void Main(string[] args) { }

        public void ExampleMethod()
        {
            MyMethodBaseInterface(ref _myInterfaceObj); //compile error
            MyMethodDerivedInterface(ref _myInterfaceObj); //no compile error
        }

        private void MyMethodBaseInterface(ref IDisposable foo) { }

        private void MyMethodDerivedInterface(ref IMyInterface foo) { }
    }
}
编译错误包括:

  • 参数1:无法从'ref'转换 CompilerErrorBaseInterface.IMyInterface'到'ref System.IDisposable' 匹配的最佳重载方法
  • 'CompilerErrorBaseInterface.Program.MyMethodBaseInterface(参考 System.IDisposable“”具有一些无效参数
有人能解释为什么编译器不允许或不可能这样做吗?我有一个使用泛型的变通方法,所以我只想了解为什么不允许这样做


谢谢。

考虑以下示例:

private void MyMethod(ref IDisposable foo)
{
    // This is a valid statement, since SqlConnection implements IDisposable
    foo = new SqlConnection();
}
如果允许您将
IMyInterface
传递给
MyMethod
,则会出现问题,因为您刚刚将
SqlConnection
(不实现
IMyInterface
)类型的对象分配给
IMyInterface
类型的变量

有关更多详细信息,请查看C#guru Eric Lippert的以下博客: