gpt4 book ai didi

c# - 具有泛型和 `InternalsVisibleTo` 的内部构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 22:29:19 25 4
gpt4 key购买 nike

在使用 InternalsVisibleTo 属性时,是否可以有一个带有内部无参数构造函数的类可以与泛型一起使用?我知道您可以使用工厂方法或反射等...来执行此操作,但最好不要使用这些方法。

如果这不可能,这是设计使然吗?如果是,为什么?

采用以下代码:

类库

[assembly: InternalsVisibleTo("testapp")]

namespace Test
{
public class MyClass
{
internal MyClass()
{
}
}
}

申请

namespace Test
{
public class GenericClass<T> where T: new()
{
// Compiles fine due to the `InternalsVisibleTo` attribute
MyClass c = new MyClass();

T t = new T();
}

public class ConsumerClass
{
// gives the error: 'MyClass' must be a non-abstract type with a public
// parameterless constructor in order to use it as parameter 'T' in the
// generic type or method 'GenericClass<T>'
GenericClass<MyClass> g;
}
}

最佳答案

这当然不会违反 CLR 中的任何内容。所以我拿了dive into Roslyn将约束显示为:

        if (typeParameter.HasConstructorConstraint && !SatisfiesConstructorConstraint(typeArgument.Type))
{
// this must be a non-abstract type with a public parameterless constructor
return false;
}

SatisfiesConstructorConstraint 只是检查

HasPublicParameterlessConstructor((NamedTypeSymbol)typeArgument) && !typeArgument.IsAbstract;

如您所料,HasPublicParameterlessConstructor 仅检查是否有任何构造函数:

constructor.DeclaredAccessibility == Accessibility.Public;

他们没有为 InternalsVisibleTo 属性实现任何回旋余地。类型信息是可用的。也许打开一个问题?

关于c# - 具有泛型和 `InternalsVisibleTo` 的内部构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58933145/

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