ホームページ > バックエンド開発 > C#.Net チュートリアル > C# の一般的な制約についての詳細なグラフィックとテキストの紹介

C# の一般的な制約についての詳細なグラフィックとテキストの紹介

黄舟
リリース: 2017-03-07 10:59:15
オリジナル
1605 人が閲覧しました

この記事では、C# ジェネリックの制約、つまり参照値の型の制約、コンストラクターの変換の型の制約、および組み合わせの制約について詳しく紹介します。非常に優れた参照値を持っています。以下のエディターで見てみましょう

1. 参照型の制約

struct RefSample ここで、参照型は制約を表すために Class を使用します。 、およびその他の参照 Type は具体的な制約です。 は、制約がクラス (参照型) である必要があり、値型 (int、char、datatime、struct) であることはできません。区別するためにインターフェイス

にすることができます。配列は参照型であることを意味します。配列の場合は、新しいオブジェクトを作成する必要があります。

RefSample として定義されていますが、渡されるのは参照型である必要がありますが、RefSample は依然として値型です

2. 値型の制約

class ValSample ここで、T:struct

は参照型です。int、char およびその他の型はすべて struct

ValSample

3. コンストラクターの型制約

public T CreateInstance<T>() where T:new()
{
  return new T();
}
ログイン後にコピー

指定された型 T は次のとおりです。持っていますコンストラクター、CreateInstance と CreateInstance は両方とも有効です。ただし、CreateInstance にはコンストラクターがありません。

4. 変換型の制約

制約を使用すると、別の型を指定できます。型引数は、一貫性、参照、またはボックス化変換を通じてその型に暗黙的に変換可能である必要があります。型引数が別の型引数に変換可能である必要があることを指定することもできます。これは型パラメーター制約と呼ばれます。

理解した意味: 交換可能、つまり、ボックス化または強制型を通じてターゲットの型に変換できる任意の型を使用して型パラメーターを渡すことができます。

class Sample ここで T:Stream

Valid: Sample これ自体は制約 Invalid:Sample に準拠します。 boxing と unboxing 、

struct Sample ここで、T:IDisposable

は、T が IDisposable 型の参照型でなければならないと規定しています 有効: Sample 無効: Sample

分析 : SqlConnection はできるのに StringBuilder はできないのはなぜですか?これらはすべて参照型です

1。SqlConnection は IDisposable インターフェイスを実装するため、共変にすることができます

2。StringBuilder は ISerializable インターフェイスのみを実装し、変換できません。 I使い捨てチャネルを通じて

class Sample ここで、T:IComparable

IComparable の型はType.IsValueType によって分析および判定され、 true は値型、 false は参照型

typeof(IComparablegt;).IsValueType

結果は false となり、参照型として表現されます

Valid: Sample< ;int> (ボックス化変換) 無効: Sample

複数の制約を指定することもできます:

T: stream、IEnumerable、IComparable

class Sample where T :U

有効: Sample

無効: Sample

概要: 受信クラスパラメータが変換することができ、指定されたパラメータと受信クラス パラメータが実装されているかどうかを確認します。同じインターフェイスが実装されている場合は OK、そうでない場合は失敗します。

は、System.Object、System.Enum、System.ValueType、System.Delegate、構造体またはシールされたクラス (String)

5. 型パラメーターの組み合わせ制約 です。注: 値型と参照型は同時に存在することはできません。参照型と値型の両方である必要はありません。

すべての値型にはコンストラクターのない関数があるため、それ以降はコンストラクター制約はありません

有効:

class Sample ここで T: class, IDisposable, new()
class Sample where T: Stream where U: IDispsable

Invalid:

class Sample where T: class, struct (即時参照型はなく、値型であるため無効です)

class Sample where T:ストリーム、クラス (参照型制約は先頭に配置される最初の制約である必要があるため、無効です) ストリームは、受信パラメーターを特定の型の Stream に制約するだけであり、クラス制約は参照型です。最初、
class Sample where T:new(),Stream (new() は最後に置く必要があります)

class Sample where T:IDisposable, Stream ( class はインターフェイスの前に配置する必要があるため、無効です)

class Sample where T: struct where U: Class, T (型パラメータ "T" には "struct" 制約があるため、" T" は "U" の制約として使用できないので無効です)

class Sample where T: Stream, U: IDisposable 構文エラー

このバージョンも であることがわかりました インターネット上で有効

理解できません: class サンプル ここで、T: struct, IDisapsable IDisapsable は値型ですか?

class Sample where T:class where U:struct ,T T は、なぜ U を値の型と一緒に制約するのでしょうか。

修正していただければ幸いです

上記は、C# の汎用制約を図で詳しく説明したものです。関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。 )!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート