私はC++でテンプレートを使用しましたが、これまでC#のジェネリックであまり気にしないようにしました。ここで私は何をしようとしているの単純化されたカットダウン版では(これはC++で可能になります)です:C#ジェネリッククラスの呼び出しメソッドはプリミティブでオーバーロードされます
class DoesStuffWithPrimatives
{
public void DoStuff(double value) { }
public void DoStuff(string value) { }
public void DoStuff(int value) { }
public void DoStuff(uint value) { }
// etc...
}
class GenericBase<T>
{
private readonly T _testValue;
private DoesStuffWithPrimatives _doesStuff = new DoesStuffWithPrimatives();
public GenericBase(T testValue)
{
_testValue = testValue;
}
public void DoStuff()
{
_doesStuff.DoStuff(_testValue);
}
}
class DoubleContrete : GenericBase<double>
{
public DoubleContrete() : base(1.54545487)
{
}
}
class IntConrete : GenericBase<int>
{
public IntConrete() : base(80085)
{
}
}
私は(GenericBase<T>
上DoStuff()
方法で)以下のコンパイルエラーが表示されます。
エラーCS1503引数1:「ダブル」
なぜDoesStuffWithPrimatives.DoStuff(…)
オーバーロードの呼び出すためのコンパイラ解決できないに「T」から変換することはできません!
を使用してCreateDelegateを処理する必要があります。あなたがその型のメソッドを使うことを可能にするために、ジェネリッククラスの型パラメータを簡単に使用するといいでしょう。 –
また、 'DoStuff(オブジェクト値)'を追加すると面白いことになりますが、エラーは起こりますが、typeパラメータで指定した内容にかかわらず、コードは 'DoStuff(オブジェクト値)'を使用するために焼き付けられます。 –
'T'を' double'にキャストできません。私はコードを試してコンパイルに失敗します。 – Sweeper