Covariant return types - C# 9.0 specification proposals | Microsoft Learn


ํด๋ž˜์Šค Person, Employee๊ฐ€ ์žˆ์Œ



Employee ๋Š” Person์˜ ํ™•์žฅ์ž„.ย 

public class Employee : Person


C# ์—์„œ๋Š” Person์— ๊ฐ€์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์„๊ฒฝ์šฐ, ํ™•์žฅ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ ๊ฐ€๋Šฅํ•จ.

public class Person
{
ย  ย  private int Id { get; set; }

ย  ย  public Person()
ย  ย  {}
ย  ย  public Person(int id)
ย  ย  {
ย  ย  ย  ย  Id = id;
ย  ย  }
ย  ย  public virtual Person GetPerson()
ย  ย  {
ย  ย  ย  ย  return new Person();
ย  ย  }
}


public class Employee : Person
{
ย  ย  private string Department { get; set; }
ย  ย  public Employee()
ย  ย  { }
ย  ย  public Employee(int id, string department) : base(id)
ย  ย  {
ย  ย  ย  ย  Department = department;
ย  ย  }
ย  ย  // ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋Š” ์–ด๋–ค ํ˜•์‹์œผ๋กœ ๋ฆฌํ„ด ํ• ๊นŒ์š”?
ย  ย  public override Employee GetPerson()
ย  ย  {
ย  ย  ย  ย  return new Employee();
ย  ย  }
}


C# 9.0์—์„œย ํŒŒ์ƒ ํด๋ž˜์Šค(Employee) ์—์„œ ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํ˜•์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์—ˆ๋Š”๋ฐ ์ด์ œ ๋จ. (์›๋ž˜๋Š” ์ €๋”ด์‹์œผ๋กœ ๋นŒ๋“œํ•˜๋ฉด ์—๋Ÿฌ ๋–ด์Œ)

๊ทธ๊ฒŒ Covariant return ์ž„.


Employeeย ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š”ย Employeeย ํด๋ž˜์Šค๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” GetPerson ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๋ฐ˜ํ™˜.

์ด๋•Œ GetPerson ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํ˜•์‹์€ Employee ํด๋ž˜์Šค์˜ Employee.



๋‹ค๋ฅธ ์˜ˆ์ œ

9.0 ์ด์ „์—๋Š” ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋–ณ์Œ

error CS0508: 'Tiger.GetFood()': return type must be 'Food' to match overridden member 'Animal.GetFood()'


C #์€ ๋ฐ˜ํ™˜ ํ˜•์‹ ๊ณต๋ถ„์‚ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? - ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ (stackoverflow.com)

class Food { }
class Meat : Food { }

abstract class Animal {
ย  ย  public abstract Food GetFood();
}

class Tiger : Animal {
ย  ย  public override Meat GetFood() => default;
}

class Program {
ย  ย  static void Main() => new Tiger();
}