前提・実現したいこと
以下のようなことがしたいのですが、コンパイルエラーが出てしまいます。
C#
1using System.Collections.Generic; 2using System.Collections.ObjectModel; 3 4namespace ConsoleApp1 5{ 6 class Program 7 { 8 static void Main(string[] args) { } 9 } 10 11 public interface IPerson { } 12 13 public interface IPeople : IReadOnlyList<IPerson> { } 14 15 public interface IStudent : IPerson { } 16 17 //エラー CS0738 'Students' は、インターフェイス メンバー 'IReadOnlyList<IPerson>.this[int]' を実装していません。'Collection<IStudent>.this[int]' は一致する 'IPerson' の戻り値の型を持たないため、'IReadOnlyList<IPerson>.this[int]' を実装できません。 18 //エラー CS0738 'Students' は、インターフェイス メンバー 'IEnumerable<IPerson>.GetEnumerator()' を実装していません。'Collection<IStudent>.GetEnumerator()' は一致する 'IEnumerator<IPerson>' の戻り値の型を持たないため、'IEnumerable<IPerson>.GetEnumerator()' を実装できません。 19 public class Students : Collection<IStudent>, IPeople 20 { 21 22 } 23} 24
明示的にインデクサとGetEnumerator()
を実装すればエラーは出なくなりますが、C# 9.0で追加された共変戻り値が使えない理由が知りたいです。
C#
1using System.Collections.Generic; 2using System.Collections.ObjectModel; 3 4namespace ConsoleApp1 5{ 6 class Program 7 { 8 static void Main(string[] args) { } 9 } 10 11 public interface IPerson { } 12 13 public interface IPeople : IReadOnlyList<IPerson> { } 14 15 public interface IStudent : IPerson { } 16 17 public class Students : Collection<IStudent>, IPeople 18 { 19 IPerson IReadOnlyList<IPerson>.this[int index] => this[index]; 20 21 IEnumerator<IPerson> IEnumerable<IPerson>.GetEnumerator() => GetEnumerator(); 22 } 23} 24
補足情報(FW/ツールのバージョンなど)
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <Nullable>enable</Nullable> <LangVersion>9.0</LangVersion> </PropertyGroup> </Project>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/03/15 15:33