I 사용자 정의에게 Maybe.cs
구현 Maybe Implementation in C# — Gist에 있고 의문에 붙여 조금 긴 Maybe.cs
솔루션공변 주조 솔루션이 필요
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FluentAssertions;
namespace FunctionalExtensions.Specs
{
[Microsoft.VisualStudio.TestTools.UnitTesting.TestClass]
public class TestMaybe
{
class Base { }
class A : Base { }
class B : Base { }
[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void TestCovariance()
{
A a = new A();
Maybe<A> ma = a.ToMaybe();
Maybe<A> maa;
Base b = a;
Maybe<Base> mb = ma;
Maybe<Base> mbb = b.ToMaybe();
// This works
(mb is Some<A>).Should().BeTrue();
maa = (Some<A>)(mb as object);
// This doesn't
(mbb is Some<A>).Should().BeTrue();
maa = (Some<A>)(mbb as object);
}
}
}
을 사용하여 다음과 같은 코드가 있습니다. 기본적으로, 나는 그러나 이것이 내가 생각하는 일을 암시 적 캐스트가 있어야한다는 사실을 명심해야합니다
Some<A>
로 변환 할 수 있는지가 실행 시간에 감지 할 필요가
object
의 인스턴스를 가지고있다. 내 생각 엔 인터페이스 (C# 표준의 일부)에서 암시 적 변환을 정의 할 수 없다는 사실에 집착하고 일부는 인터페이스입니다. 일부는 인터페이스가되어야합니다. 공변 (C# 표준의 다른 부분)
이것을 극복하는 방법에 대한 추측이나 완전히 붙어 있습니까?
질문은 약간 혼란 스럽습니다. "런타임에서 'Some '으로 변환 할 수 있으면 감지해야합니다." 그러면'x as Some Some : '이됩니다. 그래서 다른 말을하는 것 같습니까? –
나는 네가 한 것처럼 똑같습니다. (mb as object) as Some 나는 같다고 생각하지만 예외를 던지기보다는 널을 반환한다. – bradgonesurfing
공변 유형을 다루기 때문에 변환은 쉽지 않다. 일반적인 방법으로는 불가능할 수도 있습니다. – bradgonesurfing