dynamic
C#でジェネリック型引数を指定するときにどのように使用しますか?
私はC#の本でCLRを読んでいます。そして、私は次の段落に出くわします:
ジェネリッククラス(参照型)、構造(値型)、インターフェイス、デリゲート、またはメソッドにジェネリック型引数を指定するときに動的を使用することもできます。これを行うと、コンパイラは動的をオブジェクトに変換し、必要に応じてさまざまなメタデータにDynamicAttributeを適用します。使用している汎用コードはすでにコンパイルされており、型はオブジェクトと見なされることに注意してください。コンパイラがジェネリックコードでペイロードコードを生成しなかったため、動的ディスパッチは実行されません。
私が理解している限り、この抜粋はdynamic
、(たとえば)クラス定義の型引数としてを使用できることを示しています。しかし、これを試した後、type引数で他のプレースホルダーを使用するのと何ら変わりはないという結論に達しました。ですから、私の理解が正しいとは思えません。
using System;
namespace myprogram
{
class A<dynamic> {
public dynamic a;
}
class B {
public Int32 b;
}
class C<T> {
public T c;
}
class Program {
static void Main(string[] args) {
//Cannot implicitly convert type 'string' to 'myprogram.B' [Console.NET]csharp(CS0029)
//A<B> a = new A<B> {a = "foo"};
//Cannot implicitly convert type 'string' to 'myprogram.B' [Console.NET]csharp(CS0029)
//C<B> c = new C<B> {c = "foo"};
//as you can see it does not matter if I use the T or dynamic, the effect is the same
//so, what is the use of using the dynamic in the class definition?
}
}
}
タイプ「引数」とタイプ「パラメータ」の違いを理解することは非常に重要です。
このことを考慮:
class Foo<T> { } // "T" is a type parameter
...
Foo<int> f; // "int" is a type argument
型パラメーターは、このジェネリック型/メソッドに渡すことができる型を宣言します。型パラメーターは基本的に識別子であり、既存の型ではありません。型をジェネリック型/メソッドに渡す場合、渡した型は型引数と呼ばれます。これは、メソッドパラメータと引数の違いと非常によく似ています。
したがって、抜粋では、ジェネリック型が与えられた場合、その型dynamic
を渡すことができobject
、CLRによって扱われると述べようとしています。これができるという意味ではありません。
class A<dynamic> {
}
これは、次のことができることを意味します。
var list = new List<dynamic>();
または、コードで宣言されている型を使用します。
C<dynamic> c = new C<dynamic> {c = "foo"};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加