如何为Contravariance定义委托函数

时间:2014-11-07 16:08:58

标签: vb.net visual-studio

在问this previous question时,我得到了一个我知道答案是正确的答案,但我仍然(有点)没有线索如何实现它......

假设我有以下代码:

Public Class BaseClass
    ...
End Class

Public Class DerivedClass
    Inherits BaseClass

   ... Extra Fields, methods, etc ...
End Class

然后,在另一个过程中,我定义了以下函数:

Public Function DoSomething(i as Integer, s as String, b as Boolean) As List(Of BaseClass)
  ...
End Function

我正在使用它来尝试并在我的程序中返回List(Of BaseClass)List(Of DerivedClass),但不知道怎么做 - 尽管如此,现在我非常肯定(感谢the answer to my previous question)它将涉及委托函数调用。

有人可以告诉我代码的样子吗?

此外,尽管我对VB.Net更为熟悉,但我对C#的了解非常好,无法进行转换,因此任何一种解决方案都会非常有意义。

谢谢!


修改

根据@Servy在下面的回答中提供的反馈,我知道这不是关于创建委托功能,而是关于从我的函数返回IEnumerable(OF BaseClass)而不是List(Of BaseClass)。所以,我改变了它,但它还没有工作...... 我现在明白了为什么,但不知道该怎么办......

当前代码:

Public Function DoSomething(i as Integer, s as String, b as Boolean) As IEnumerable(Of BaseClass)
    Dim RetVal as New List(Of BaseClass)
    Dim ToAdd as BaseClass
       ... some code ...
    ... loop 
        Retval.Add(ToAdd)
    ...
    Return RetVal
End Function

现在,我无法将代码中的RetVal更改为IEnumerable,因为此时不允许Add

我如何做我在这里尝试做的事情?

谢谢!!!

1 个答案:

答案 0 :(得分:0)

类型List<T>T不一致,所以你想要的是不可能的。要利用协方差,您需要使用支持协方差的类型,例如IEnumerable<T>

虽然代表们可以自己利用协方差,但他们仍然需要有问题的类型来支持它。他们不会做任何事情让你将List<T>视为协变。