为什么类型推断和隐式运算符在以下情况下不起作用?

TN.*_*TN. 2 .net c# generics type-inference implicit-conversion

我将试着用一个例子来解释我的问题:

class V<T>
{
    public readonly Func<T> Get;
    public readonly bool IsConstant;

    V(Func<T> get, bool isConstant)
    {
        Get = get;
        IsConstant = isConstant;
    }

    public static implicit operator V<T>(T value)
    {
        return new V<T>(() => value, true);
    }

    public static implicit operator V<T>(Func<T> getter)
    {
        return new V<T>(getter, false);
    }
}

void DoSomething<T>(V<T> v)
{
    //...
}

void Main()
{
    DoSomething<string>("test"); // (1) type inference is not working
    DoSomething<string>((V<string>)(() => "test")); // (2) implicit operator does not work
}
Run Code Online (Sandbox Code Playgroud)

在方法中Main,我有两种情况:

  1. 我必须明确指定泛型参数<string>的方法DoSomething.
  2. 在这里,我必须添加显式转换(V<string>),隐式运算符似乎不起作用.

为什么需要这个?编译器正在考虑哪些替代方案,因此无法选择正确的方法?

Eri*_*ert 5

你的第二个问题是,为什么从隐式转换()=>""V<string>不会成功,即使()=>""是转换为Func<string>Func<string>可转换为V<string>.

再说一遍,我不知道怎么回答"为什么不呢?" 问题,但我知道如何回答"规范的哪一行表明编译器应该拒绝这个代码?"的问题.相关的是:

首先,如果需要,执行从源类型到用户定义或提升转换运算符的操作数类型的标准转换.

请注意,这里有一个小错误; 这应该说是从源表达式执行标准转换.源表达式可能没有类型.我相信在离开团队之前我已经将这个说明交给了规范维护者,所以希望这将在下一版本中修复.

无论如何,现在应该清楚这里发生了什么.没有从lambda到委托类型的标准转换,因此用户定义的转换被转换解析算法分类为不适用.