1

これがコードです。最後の行は、私がやっていることのハイライトです:

public interface IHasContext<TContext> {
  TContext Context {get; set;}
}
public static class Extensions {
  public static void ProcessContext<THasContext, TContext>(this THasContext t)
    where THasContext : IHasContext<TContext> 
    where TContext : class {
      //...
  }
}
public class SomeClassContext {/*...*/}
public class SomeClass : IHasContext<SomeClassContext> { 
  public SomeClassContext Context {get; set;}
  //...
}

//now in a function I can do:
  objSomeClass.ProcessContext<SomeClass, SomeClassContext>();

SomeClass含まれていることは既にわかっている<SomeClassContext>ので、次のようにします。

  objSomeClass.ProcessContext(); 

<SomeClass, SomeClassContext>チャンクなし。出来ますか?それを達成するには、コードをどのように変更すればよいですか? ありがとうございました :)

4

1 に答える 1

4

2 つのジェネリック パラメーターが必要な理由がわかりません。1つだけ使用してください:

public static class Extensions {
  public static void ProcessContext<TContext>(this IHasContext<TContext> t)
    where TContext : class {
    //...
  }
}

その後、推論は問題なく機能するはずです。

var obj = new SomeClass();
obj.ProcessContext();

この 2 つの間には、わずかな意味上の違いが 1 つあります。タイプSomeClassが a のstruct場合、バージョンは引数をボックス化しませんがt、このバージョンはボックス化を引き起こします。

于 2013-09-22T08:16:04.530 に答える