rksoftware

Visual Studio とか C# とかが好きです

C# 共変の戻り値の型の確認

C# の共変の戻り値の型という機能は、インタフェースを実装するタイミングでは使えないと聞き確認してみました。

確認コードです。
ついでで非 virtual メソッド、abstract メソッドも試しています。

// Return の型
class ReturnTypeBase { }
class ReturnType : ReturnTypeBase { }

// インタフェース
interface IInterFace { ReturnTypeBase InterfaceMethod(); }

// 基底クラス
abstract class SampleBase
{
    // virtual メソッド
    public virtual ReturnTypeBase ClassMethod() => null;
    // 非 virtual メソッド
    public ReturnTypeBase ClassMethodNotVirtual() => null;
    // abstract メソッド
    public abstract ReturnTypeBase AbstractMethod();
}

// 実装クラス
class Sample : SampleBase, IInterFace
{
    public ReturnType InterfaceMethod() => null;
    public override ReturnType ClassMethod() => null;
    public new ReturnType ClassMethodNotVirtual() => new ReturnType();
    public override ReturnType AbstractMethod() => null;
}

確かにエラーになります。
f:id:rksoftware:20210704123830j:plain

エラーの内容です。

エラー  CS0738
'Sample' は、インターフェイス メンバー 'IInterFace.InterfaceMethod()' を実装していません。
'Sample.InterfaceMethod()' は一致する 'ReturnTypeBase' の戻り値の型を持たないため、
'IInterFace.InterfaceMethod()' を実装できません。

確かにインタフェースの実行時には使えませんでした。覚えておきましょう。