我想知道为什么这是编译错误,以便更好地理解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) { }
}
}
编译错误是:
任何人都可以解释为什么不允许这样做,或者编译器无法做到这一点?我有一个使用泛型的解决方法,所以我只想理解为什么不允许这样做。
感谢。
答案 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的以下博客条目: