Type Forwarding を使用してクラス参照を別のアセンブリに転送する場合、そのクラスは Type から継承する必要がありますか?
私が本当に求めているのは、タイプ転送のフレーズと概念の「タイプ」という言葉が何を意味するのか、または何を示しているのかということだと思います。
Type Forwarding を使用してクラス参照を別のアセンブリに転送する場合、そのクラスは Type から継承する必要がありますか?
私が本当に求めているのは、タイプ転送のフレーズと概念の「タイプ」という言葉が何を意味するのか、または何を示しているのかということだと思います。
Type Forwarding を使用してクラス参照を別のアセンブリに転送する場合、そのクラスは Type から継承する必要がありますか?
いいえ。
私が本当に求めているのは、タイプ転送のフレーズと概念の「タイプ」という言葉が何を意味するのか、または何を示しているのかということだと思います。
アセンブリ Alpha に型 Foo があり、次のバージョンで、Foo がアセンブリ Bravo にあるべきだったことに気付いたとします。アルファ版の Foo に依存しているすべての顧客が壊れてしまうため、型を移動することはできません。
解決策は、タイプ Foo を Bravo に移動してから、Alpha のユーザーに「Foo を探している場合、Bravo にある」ことを伝えるタイプ フォワーダーを含む新しいバージョンの Alpha を出荷することです。そうすれば、以前のやり方に依存している人々を壊すことはありません。
ここで欠けているのは、タイプ転送の概念における「タイプ」の定義です。タイプとしての資格は何ですか?
以下は型定義です。
次のものは型参照です(それらはすべて別の型を参照します。これらはいずれも新しいものを定義しません)。
(そして、どちらのカテゴリにも当てはまらない型が 1 つあります。これは、戻り値の型「void」です。)
これらすべてのタイプのうち、転送できるのはタイプ定義だけです。型フォワーダーの目的は、「このアセンブリによって定義されていた型が、そのアセンブリによって定義されるようになった」ということです。タイプを転送することはできませんMyStruct<int>[]
。それは意味がありません。転送できますMyStruct<T>
。
「構築されていないジェネリック クラス」とはどういう意味ですか?これは、指定された型でインスタンス化されたジェネリックではなく、ジェネリックの定義のみを意味しますか?
正しい。
また、「型参照」と「型定義」に関する情報を見つけた場所を教えていただけますか?
これらは C# 言語仕様の概念ではありません。むしろ、これらは基礎となる共通言語インフラストラクチャ タイプ システムの概念です。定義された型と参照された型の間で CLI がどのように異なるかについての詳細な技術的考察については、ECMA 335 CLI 仕様を読み、特に TypeDef と TypeRef のメタデータ テーブルに関するセクションを探してください。
少し紛らわしいトピックなので、ここに段階的な例を示します.Ericの回答の名前を使用して、一貫性を保つのに役立ちます. 1 つのライブラリ (Alpha.dll) から始めて、Alpha に依存するアプリケーション (Test.exe) を構築します。次に、Test.exe を再コンパイルせずに、Test.exe が依存する型 (Foo) を別のライブラリ (Bravo.dll) に移動します。
次のファイルを作成します。
Foo.cs
using System;
public class Foo
{
public static void Report()
{
Console.WriteLine("Foo.Report");
}
}
Test.cs
class Test
{
static void Main()
{
Foo.Report();
}
}
Alpha.dll をビルドします。
csc /target:library /out:Alpha.dll Foo.cs
Test.exe をビルドします。
csc /r:Alpha.dll Test.cs
Test.exe を実行します。明らかな出力が得られるはずです。
Bravo.dll をビルドします。
csc /target:library /out:Bravo.dll Foo.cs
新しいファイルForwarding.csを作成します。
using System.Runtime.CompilerServices;
[assembly:TypeForwardedTo(typeof(Foo))]
Alpha.dll を再コンパイルします。
csc /r:Bravo.dll /target:library /out:Alpha.dll Forwarding.cs
Alpha で Foo のコードを含めていないことに注意してください。
Test.exe を実行します - Test.exe が Alpha.dll 内の Foo への参照を要求するという事実にもかかわらず、それでも機能します... CLR は単にそれを Bravo.dll にリダイレクトします。
Test.exe を見ると、まだ Alpha を参照しています。Alpha.dll を調べると、Foo 型のコードがなくなっていることがわかります。すべてがぶら下がっているのは型の転送のみです。