当接口中存在重载方法时,为什么我的代码调用了错误的方法

时间:2013-07-10 11:33:10

标签: c# interface overloading

我有两种方法:

public void WriteRecord(string collectionName, IDatabaseRecord databaseRecord)
public void WriteRecord(string collectionName, BsonDocument bsonDocument)

我将它们包含在我的界面中:

void WriteRecord(string collectionName, BsonDocument bsonDocument);
void WriteRecord(string collectionName, IDatabaseRecord databaseRecord);

然后我打电话的时候;

_databaseClient.WriteRecord(Collections.Tracking, workflowTrackingRecord);

其中 workflowTrackingRecord 的类型为 WorkflowInternalTrackingRecord:IDatabaseRecord

我可以看到代码试图调用第二个方法(使用 BsonDocument 的方法),因为我在上面的行中得到了这个编译错误。:

“类型'MongoDB.Bson.BsonDocument'是在未引用的程序集中定义的。您必须添加对程序集'MongoDB.Bson ...'的引用。

如果我删除

void WriteRecord(string collectionName, IDatabaseRecord databaseRecord); 

从界面

_databaseClient.WriteRecord(Collections.Tracking, workflowTrackingRecord);

工作正常。

为什么编译器指向错误的方法。它用什么标准来决定?

1 个答案:

答案 0 :(得分:1)

你还没有得到足够的结论,认为编译器选择了错误的重载。要确定哪个重载是合适的,编译器需要BsonDocument和IDatabaseRecord的类型信息。但它无法做到这一点,它只知道BsonDocument存在但不知道它是什么样的。

或者换句话说,编译器不仅对完美的候选人满意,而且想知道所有。在这种特定的情况下并没有那么明显有用,但是如果重载有任何歧义,那么你得到一个好的错误信息以及避免编译器选择错误的错误信息是非常重要的,因为它对正确的信息不够了解

只需提供装配参考,您的问题就会得到解决。