4

これは分散全体に関係していると思いますが、なぜこれが許可されていないのかよくわかりません。

方法があります

public void method(Func<Enum, String> func)

そして、私は次のようないくつかの異なる方法を持っています

public String doSomething(someEnum)
public String doSomethingElse(someOtherEnum)

こんな風に電話したい

method(doSomething)
method(doSomethingElse)

しかし、私はこれらのエラーが発生します

「メソッドグループ」から変換System.Func<System.Enum,string>

これができない理由は何ですか?メソッドをこのように複数のメソッドに書き直す必要は本当にあるのでしょうか?

public void method(Func<someEnum, String> func)
public void method(Func<someOtherEnum, String> func)

それは本当に醜いです。

編集:

メソッドでこのようなことをしたい (実際のコードでは、enumType も Type として渡されることに注意してください)

foreach (Enum val in Enum.GetValues(enumType))
{
      func(val);
}
4

4 に答える 4

3

あなたはおそらく逃げることができます

 public void method<TEnum>(Func<TEnum, String> func)

または、一般的なデリゲートを定義できます。

 delegate String MyFunc<T>(T);

C# 4.0 では (試したことはありませんが)、共分散/反分散を使用できると思います:

 delegate String MyFunc1<in  T>(T);
 delegate String MyFunc2<out T>(T);

MyFunc<Derived>これは、に割り当てることができることを意味する必要がありますMyFunc<Base>


編集型制約を指定できないため、列挙型に対して実際に共分散を機能させることができないことがわかりました。

delegate string Display<in T>(T v) where T : Enum;

収量:

 test.cs|5 col 50 error 702| A constraint cannot be special class `System.Enum'

したがって、 Enum1 から Enum2 を派生させることはできないため、不変Enumのジェネリックに固執しています。バガー。

于 2011-10-26T19:11:22.793 に答える
2

ここには2つの問題があります。

  1. 変換は共分散を期待していますが、Func<in T, out TResult>実際には最初のジェネリックパラメーターでは反変です。特定の列挙型で動作するメソッドを、任意の列挙型で動作できるメソッドとして表示することはできません。他の任意の列挙型インスタンスでデリゲートを呼び出そうとした場合、どうなると思いますか?

  2. 最初の問題に対処したとしても(おそらく変換を逆にすることで?)、これは機能しません。バリアント変換はボクシング変換ではうまく機能しませsomeEnum -> System.Enum-からの変換はそのような変換です。参照:値型で共変性の機能を委任しないのはなぜですか?詳細については。

于 2011-10-26T19:16:29.063 に答える
2

オーバーロードされたメソッドを作成する必要はありません。次を考慮してください。

public void method(Func<Enum, string> func) {...}
public string doSomething(MyEnum e) {...}

method((Enum e) => doSomething((MyEnum)e));

もちろん、必要に応じて強制/キャストするのはあなたの責任です。

ハッピーコーディング。

于 2011-10-26T19:25:00.607 に答える
1

問題は、Enumクラスが実際にはあなたが思っているEnumではないということです。列挙型は実際には[列挙型]から派生したものではなく、一般的な制約を列挙型として表現することもできません。

つまり、Func<T> where T : Enum無効です。

最善の策は、メソッドが列挙型のみを受け入れるように制限することです。

Method<T>(Func<T, string> func) where T : struct, IConvertible

于 2011-10-26T19:18:38.220 に答える