9

リフレクションを介してクエリを実行すると、それ自体が正の IsValueType および正の IsClass としてマークされるように C# クラスを設計することは可能ですか?

それとも、実際には相互に排他的なマーキングですか?

そんなこと知ってる、

ほとんどのプリミティブ型 (列挙型と構造体を含む) が返されます:
IsValueType=true、IsClass=false。

文字列または任意のクラス - 抽象も..戻り値:
IsValueType=false、IsClass=true。

インターフェイスの戻り値:
IsValueType=false、IsClass=false

4

1 に答える 1

7

リフレクションを介してクエリを実行すると、それ自体が正の IsValueType および正の IsClass としてマークされるように C# クラスを設計することは可能ですか?

これらの実装を見てみましょう。

protected virtual bool IsValueTypeImpl()
{
      return this.IsSubclassOf((Type) RuntimeType.ValueType);
}

public bool IsClass
{
  [__DynamicallyInvokable] get
  {
    if ((this.GetAttributeFlagsImpl() & TypeAttributes.ClassSemanticsMask) == TypeAttributes.NotPublic)
      return !this.IsValueType;
    else
      return false;
  }
}

ご覧のとおり、IsValueTypeImpl()(プロパティによって呼び出されIsValueTypeます)は継承に依存IsClass し、 IsValueType (!) に依存します。

次に、この ValueType の説明では、ValueTypeから直接継承することはできないと述べています。

したがって、答えはノーです。同時になるタイプIsClassを作成することはできませんIsValueType

于 2013-04-23T08:49:38.440 に答える