5
  • まとめ

    typeof(ISomeInterface).BaseTypeですnull; 定義によるものtypeof(object).BaseTypeでもあります。nullしたがって:

    typeof(object).BaseType==typeof(ISomeInterface).BaseType -> true 
    

    それは(意味的に)System.Objectインターフェースでもあるという意味かもしれませんね。C#では、すべてのクラスはから継承しSystem.Objectますが、インターフェイスは継承しません。実際、インターフェースはコントラクトであり、クラスの基本型ではなく、他のインターフェースからのみ派生できます。

    だから私はtypeof(object).BaseTypeインターフェイスと同じである必要があるかどうか疑問に思っていますか?

  • 説明

    私はこれを基本的な数理論理学の方法で考えました。null私はととして扱ったので0、あるタイプの基本タイプを見つけることは、数の因数を見つけることと同じです。typeof(object)1

    この仮定の下では、任意の数の倍数のnullように、任意のタイプの派生である可能性があります。0そして、それ自体でさえ任意の数の要因であるtypeof(object)ように、任意のクラスの基本タイプになります。1しかし、実際に戻ってきたということnulltypeof(object).BaseType、この仮定を破りました。これは、それが他の数の要因ではなく0、要因であると言っているようです。1

    さらに、メソッドを使用してSomeType再帰的にの基本型を見つける場合、 is 、isでSomeTypeあるため、必ずしもクラスではないとは言えません。BaseTypenulltypeof(object).BaseTypenull

    逆説的なようです

    typeof(object).BaseType==typeof(object) -> true 
    

    その基本タイプがそれ自体であることを示すために、しかしそれはエンティティとコントラクトの正確な違いではありませんか?


アップデート:

私は最初に次のように述べました:

System.Objectインターフェースでもあるのではないでしょうか?

私が言いたいのはそれが混乱しているようだということです。説明が不十分なのは私のせいであり、それに焦点を当てた答えを出して申し訳ありません。

4

6 に答える 6

7

クラスインターフェースは2つの異なるものです。次の式:

typeof(object).BaseType == typeof(SomeInterface).BaseType

次のことも当てはまるという理由だけで当てはまります。

null == null

また、定義上、現在の型がオブジェクトクラスまたはインターフェイスを表す場合、 BaseTypeはnullを返します。

System.Objectもインターフェースだと思いませんか?

インターフェイスにはメソッドのシグネチャのみが含まれ、実装は含まれていないため、実際にはそうではありません。インターフェイスは、クラスが実装する必要のあるコントラクトと考えることができます。

于 2012-12-23T14:21:49.930 に答える
6

このBaseTypeプロパティは、基本タイプを持つタイプの基本タイプを返します他のすべてのタイプの場合、タイプに基本タイプがないことを示す値を返します。元の質問で次の表現を提示しました。

typeof(object).BaseType == typeof(SomeInterface).BaseType

次に、この式が真でObjectありSomeInterface、同じ基本タイプを持っているように見えるので、提案しました。ただし、メソッドのドキュメントにそうではないと明示的に記載されている場合、Objectとの両方の基本型が存在することを前提としているため、結論に欠陥があります。SomeInterface

于 2012-12-24T04:11:22.817 に答える
4

typeof(object).BaseTypenullMSDNが言うために戻ります;

オブジェクトは基本型を持たない唯一の型であるため、オブジェクトの基本型としてnullが返されます。

BasTypeitプロパティを。と一緒に使用することはできませんInterface。このコードを見てみましょう。

using System;

namespace Programs
{
    public interface IBar { }
    public interface IFoo : IBar { }

    public  class Program
    {
        public static void Main(string[] args)
        {
            Type[] types = typeof(IFoo).GetInterfaces();

            foreach ( var t in types )
            {
                Console.WriteLine(t.ToString());
            }
        }
    }
}

出力:

Programs.IBar


インターフェイスは、0個以上のベースインターフェイスから継承します。したがって、オブジェクトがを表すnull場合、このプロパティが返されます。ベースインターフェイスは、またはで決定できます。TypeinterfaceGetInterfacesFindInterfaces


もう1つのコードを見てみましょう。

using System;

namespace Programs
{
    public interface IBar { }
    public interface IFoo : IBar { }
    public interface IZoo : IFoo { }

    public  class Program
    {
        public static void Main(string[] args)
        {
            Type[] types = typeof(IZoo).GetInterfaces();

            foreach ( var t in types )
            {
                Console.WriteLine(t.ToString());
            }
        }
    }
}

出力は次のとおりです。

Programs.IFoo

Programs.IBar


問題は、typeof(object).BaseTypeのいずれかでnullを取得したことです。System.Objectもインターフェースだと思いませんか?

いいえ、System.Objectはインターフェースではありません。クラスです。.NETFrameworkクラス階層内のすべてのクラスをサポートします。

于 2012-12-23T14:18:45.013 に答える
4

注意:インターフェースは、クラスや構造体がそうであるという意味で型ではありません!インターフェイスはそれ自体では存在しません。

クラスと構造体はデータ(コード)の型ですが、インターフェースは型の型です。それらは他のタイプを分類するために使用できます。それらは他のタイプにプロトコルに従うように強制し、それ以上は何もしません。それらは単なるレイアウト、定義、契約です。既存のものではありません。

于 2012-12-23T15:51:20.487 に答える
3

System.Object.netには、、、、などの「特別な」タイプがいくつかありSystem.ValueTypeSystem.Enum継承階層での動作は一意です。たとえば、Tから派生する型は、どちらかがクラス型であるか、であるSystem.ValueType場合を除いて、値型になります。のベースタイプの欠如は、おそらく同様の観点から見ることができます。ベースタイプを欠くすべてのタイプは、奇妙なものを除いて、インターフェイスです。TSystem.ValueTypeSystem.EnumObjectSystem.Object

于 2013-02-03T21:39:40.023 に答える
1

「それは(意味的に)System.Objectもインターフェースであることを意味しているのではないでしょうか?」

いいえ、その仮定はこれらの仮定に依存しています。

  • BaseTypeプロパティは、常に型の基本型を返します
  • 同じ基本タイプを持つ2つのタイプは同じです

typeof(object).BaseType戻り値の場合null、基本タイプがnullであるという意味ではなく、基本タイプがまったくないことを意味します。したがって、typeof(ISomeInterface).BaseTypeも返された場合null、それがと同じ基本タイプを持っていることをobject意味するのではなく、それも基本タイプをまったく持っていないことを意味します。

objectとインターフェイスの基本タイプが同じであっても、それがobjectインターフェイスであるとは限りません。たとえば、タイプintとは同じ基本タイプを持っていますが、それはそれらが同じであるという意味ではありません。double

于 2013-05-05T08:59:15.483 に答える