gpt4 book ai didi

c# - 显式转换运算符失败,出现 "assembly is not referenced"错误

转载 作者:可可西里 更新时间:2023-11-01 03:11:18 24 4
gpt4 key购买 nike

这是一个非常不常见的问题,肯定有很多解决方法,但我想了解实际发生的情况以及为什么它不起作用。
所以我在测试解决方案中有 3 个程序集,第一个程序集的类型为 ClassA:

public class ClassA
{
public string Name { get; set; }
}

第二个程序集引用第一个程序集并具有 B 类:

public class ClassB
{
public string Name { get; set; }

public static explicit operator ClassA(ClassB objB)
{
return new ClassA
{
Name = objB.Name
};
}
}

它有一个显式运算符可以强制转换为 ClassA 类型。假设我们出于某种原因不能使用继承,只能使用转换作为将一种类型转换为另一种类型的便捷方式。

现在,最后一个程序集引用了第二个程序集(而不是第一个!)并且类型为 ClassC:

public class ClassC
{
public string Name { get; set; }

public static explicit operator ClassB(ClassC objC)
{
return new ClassB
{
Name = objC.Name
};
}
}

出于与 ClassB 相同的原因,它使用显式转换运算符。

现在是有趣的部分:如果我尝试在我的代码中从 ClassC 转换为 ClassB,如下所示:

ClassC objC = new ClassC();
ClassB objB = (ClassB)objC;

我收到以下错误:

Error 1 The type 'FirstAssembly.ClassA' is defined in an assembly that is not referenced. You must add a reference to assembly 'FirstAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

我可以很容易地创建 ClassB 的新实例,并使用 ClassC 实例的值对其进行初始化(就像我在显式转换运算符中所做的那样),它会工作得很好。那么这里有什么问题呢?

最佳答案

在 C# 语言规范(4.0 版)的 6.4.5 用户定义的显式转换部分中,它显示:

A user-defined explicit conversion from type S to type T is processed as follows:

• Determine the types S0 and T0. If S or T are nullable types, S0 and T0 are their underlying types, otherwise S0 and T0 are equal to S and T respectively.

• Find the set of types, D, from which user-defined conversion operators will be considered. This set consists of S0 (if S0 is a class or struct), the base classes of S0 (if S0 is a class), T0 (if T0 is a class or struct), and the base classes of T0 (if T0 is a class).

它没有定义如何编译器将“查找类型集”,但我认为它会搜索所有相关类以寻找下一步的候选对象:

• Find the set of applicable user-defined and lifted conversion operators, U. This set consists of the user-defined and lifted implicit or explicit conversion operators declared by the classes or structs in D that convert from a type encompassing or encompassed by S to a type encompassing or encompassed by T. If U is empty, the conversion is undefined and a compile-time error occurs.

这会导致它尝试解析对 ClassA 的引用。

关于c# - 显式转换运算符失败,出现 "assembly is not referenced"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22986300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com