1

looking at this code

delegate void StringAction (string s);
class Test
{
static void Main()
{
    StringAction sa = new StringAction (ActOnObject);
    sa ("hello");
}
static void ActOnObject (object o)
{

   Console.WriteLine (o); // hello
 }
}

Is this code is working due to Contravariance ? ( MoreDeriverdRef <== LessDerivedRef )

or because

(unrelated to contravariance) - In c# I can execute a method like ActOnObject (object o) with ActOnObject ("lalala")

4

2 に答える 2

3

Eric Lippert がこの記事で述べているように、このコードは次の理由で機能します。

変換を委任するメソッド グループは、引数の型が反変です。

上記は参照型にのみ当てはまりますが、 と は両方ともstring参照object型であるため、要件は満たされています。

この種のバリアンスは C# 2.0 以降サポートされており、バージョン 4 で導入された追加のサポートに依存する必要はありません。

于 2012-10-01T10:17:37.783 に答える
0

はい、それは反変性によるものです。

つまり、シグネチャが一致するメソッドだけでなく、より多くの派生型を返す (共分散) メソッドや、デリゲート型で指定されたものよりも派生型が少ない (反変性) パラメーターを受け入れるメソッドも、デリゲートに割り当てることができます。

http://msdn.microsoft.com/en-us/library/dd233060(VS.100).aspxから取得

于 2012-10-01T10:32:48.400 に答える