継承ツリーにジェネリッククラスを持つUserControl
-
03-07-2019 - |
質問
ジェネリッククラスを継承するUserControlを作成しようとしています。ジェネリッククラスから直接継承するのではなく、ジェネリックを使用しない中間クラスを通じて継承します。これは実行時にコンパイルおよび動作しますが、設計時にエラーが発生します。
ここに私の一般的な親クラスがあります:
Public Class GenericParent(Of T)
Inherits UserControl
End Class
ここに私の非ジェネリックな親クラスがあります:
Public Class NonGenericParent
Inherits GenericParent(Of String)
End Class
ここに私のXAMLがあります:
<local:NonGenericParent x:Class="SilverlightApplication5.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SilverlightApplication5"
Width="400" Height="300">
<StackPanel>
<Button Content="Hello"/>
</StackPanel>
</local:NonGenericParent>
IntelliSenseパーサーは次のエラーを返します:
- プロパティ「Width」がタイプ「NonGenericParent」で見つかりませんでした。
- プロパティ「Height」がタイプ「NonGenericParent」で見つかりませんでした。
- 「NonGenericParent」タイプは直接コンテンツをサポートしていません。
IntelliSenseは、GenericParentクラスを超えて継承ツリーを確認できないようです。 SilverlightApplication5.Pageクラス、NonGenericParentクラスでContentPropertyAttributeを直接指定しようとしましたが、機能しません。
Silverlight 2.0ではTypeArguments属性がサポートされていないことを読みました。それが中間NonGenericParentクラスを作成した理由です。
誰かがこれらのエラーを黙らせる方法を知っているなら、私はそれらを聞きたいと思います。
更新: MSFTでサポートチケットを開きました。ソリューションが何であれ、これを更新します。
解決
マイクロソフトから、これは将来のバージョンでは修正されない可能性があるという情報を受け取りました。責任グループを見つけようとすることで問題をバウンスした後、この問題はWPF開発者グループに属しているように見えます。WPF開発者グループは、「修正しない」という回答の出所です。
その間、XAML 2009を推測するまで、親クラスからジェネリックを削除するようにコードを更新しました。
他のヒント
silverlightについてはわかりませんが、これはc#で期待どおりにコンパイルおよび実行されます:
class GenericObject[T] : UserControl
{
}
class StaticObject : GenericObject[Int32]
{
public Int32 wide { get { return this.Width; } }
}
private void Form1_Load(object sender, EventArgs e)
{
StaticObject so = new StaticObject();
this.Text = so.wide.ToString();
}
clrに対してコンパイルする場合、正常に動作するはずです。
あなたが提案しているように、単なるインテリセンスのバグかもしれません。通常、コライダーの警告を無視することをお勧めしますが、この場合、警告は無効であるようです。
編集:山括弧を角括弧に置き換えると、それらが削除されます。
シルバーライトが2.0であるにもかかわらず(特に、シルバーライトのVS2008の微調整)はまだ非常に若いです。 IDEにはまだ奇妙な点があります。
ビルドが成功した後でも問題は解決しませんか?
このブログ投稿はあなたの問題に関連しているようです:
Silverlightの場合、これを機能させるには3つのクラスが必要なようです。