私の質問はIs there a reasonable approach to "default" type parameters in C# Generics?に関連していますが、アプローチが機能しない内部ジェネリッククラスを使用しています。一般的なオプションを作ることができますか?特定のクラスにデフォルト設定していますか?
using System;
public class FooEventArgs<T> : EventArgs
{
// ... T properties and a constructor
}
public class Foo<T>
{
public delegate void EventHandler<FooEventArgs>(object sender, FooEventArgs<T> e);
public event EventHandler<FooEventArgs<T>> Changed
}
そして、それは次のように使用されていると::このようなコードが与えられ
ありますように私は、一般的なオプションを持っていることができれば
public class User
{
public Foo<int> foo1;
public Foo<object> foo2;
public User()
{
foo1 = new Foo<int>();
foo2 = new Foo<object>();
foo1.Changed += foo1_Changed;
foo2.Changed += foo2_Changed;
}
protected void foo1_Changed(object sender, FooEventArgs<int> e) { ... }
protected void foo2_Changed(object sender, FooEventArgs<object> e) { ... }
}
まあが、私はむしろそれをみたいです(データは、独自の変数型を持ち、.NET型に変換された外部システムから来ていますが、 1つのリモートデータ型は、いくつかの.NET型の1つに変わる可能性があります。また、 "any"タイプ-ようobject
は、そのような場合のための唯一の本当の答えになります)
(それはまた、以前にリンクされている問題の主な提案だった)サブクラス化して、すぐに私に起こったソリューション:。
public class Foo : Foo<object>
{
public Foo(...) : base(...) { }
}
public class FooEventArgs : FooEventArgs<object>
{
public Foo(...) : base(...) { }
}
私は、このようにそれを使用したい:
public class User
{
public Foo foo3;
public User()
{
foo3 = new Foo();
foo3.Changed += foo3_Changed;
}
protected void foo3_Changed(object sender, FooEventArgs e) { ... }
}
問題は、それが自然foo3_Changed
がFooEventArgs
を受け入れるでは動作しませんということです。 FooEventArgs<object>
が必要です(Foo<object>
からの値になるため)Foo.Changed
イベントがそれに渡されます。
Foo.cs(3,1415926): error CS0123: No overload for 'foo3_Changed' matches delegate 'FooLibrary.Foo<object>.EventHandler<FooLibrary.FooEventArgs<object>>'
私はこれについて何かできることはありますか?クラスの多くを複製することはできませんか?
もう1つのことを試しました。FooEventArgs<object>
からFooEventArgs
に変換する暗黙の演算子です。私は理由について明確ではないんですけれども
public static implicit operator FooEventArgs(FooEventArgs<object> e)
{
return new FooEventArgs(...);
}
これは、残念ながら、動作していないよう:
EditBuffer.cs(13,37): error CS0553: 'FooLibrary.FooEventArgs.implicit operator FooLibrary.FooEventArgs(FooLibrary.FooEventArgs<object>)': user-defined conversions to or from a base class are not allowed
それでは、もう一度、私はこれについて何かできることがあり、私はそれがタフな幸運であると考えて正しいですか?私はちょうどFooEventArgs<object>
を使ってコンテンツにする必要があります(そして、私はちょうどFoo<object>
を使用するかもしれません)?
[関連](https://github.com/dotnet/csharplang/issues/253) – Shimmy