C#为什么我不能通过ref传递“base”接口?

时间:2016-03-31 10:10:49

标签: c# oop interface ref

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

在我的代码中,我有一个从IDisposable派生的接口(IMyInterface)。我有另一种方法,它采用'ref IDisposable'类型的参数。但我不能将IMyInterface类型的成员var传递给该方法。以下是我的示例代码:

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 CompileErrorBaseInterface.IMyInterface'到'ref System.IDisposable'
  • 的最佳重载方法匹配
  • 'CompileErrorBaseInterface.Program.MyMethodBaseInterface(参照 System.IDisposable)'有一些无效的参数

任何人都可以解释为什么不允许这样做,或者编译器无法做到这一点?我有一个使用泛型的解决方法,所以我只想理解为什么不允许这样做。

感谢。

1 个答案:

答案 0 :(得分:7)

考虑以下示例:

private void MyMethod(ref IDisposable foo)
{
    // This is a valid statement, since SqlConnection implements IDisposable
    foo = new SqlConnection();
}

如果您被允许将IMyInterface传递给MyMethod,那么您就会遇到问题,因为您刚刚分配了SqlConnection类型的对象(未实现{ {1}})到IMyInterface类型的变量。

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