gpt4 book ai didi

c# - 泛型方法如何知道不可访问的类型? (或 "How I Lost a Dollar")

转载 作者:太空狗 更新时间:2023-10-30 00:03:44 25 4
gpt4 key购买 nike

因此,我们向我们的团队下了一个小赌注,看是否可行。我输了。这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using MyNamespace;

namespace PrivateGeneric
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private void WhoIsRight_Click(object sender, RoutedEventArgs e)
{
var store = new GenericDataStore();

try
{
var data = new MyPrivateClass();
store.StoreTheData(data);
object theData = store.GetTheData<MyPrivateClass>();
if (theData == null || !(theData is MyPrivateClass))
{
throw new Exception();
}
MessageBox.Show("Seann was right.");
}
catch (Exception)
{
MessageBox.Show("WOOOOOOOOOT!!!!! PHIL WINS!!!!!! HAHAHAHA!!!!!! PWNED!!!!!!!");
}
}

private class MyPrivateClass
{

}
}
}

namespace MyNamespace
{
public class GenericDataStore
{
readonly List<object> _store = new List<object>();

public void StoreTheData<T>(T data)
{
_store.Add(data);
}

public object GetTheData<T>()
{
//How does "t is T" work if T is a private type unknown to this class?
return _store.FirstOrDefault(t => (t is T));
}
}
}

为什么它起作用的问题在代码中突出显示。 “is”是否不需要转换为 T 来确定它实际上是否是 T?这样做不需要可访问的类型吗?显然不是这样,那么高亮线是通过什么机制来判断的呢?

最佳答案

这样想:

class C
{
private const int BigSecret = 0x0BADFOOD;
public static void M() { D.X(BigSecret); }
}
class D
{
public static void X(int y) { Console.WriteLine(y); }
}

当 C.M 被召唤时,D.X 得知 secret 并与全世界分享。 BigSecret 是私有(private)的这一事实无关紧要;您传递了它的。不允许代码看到私有(private)字段的,不允许使用私有(private)字段的名称。 X 可以完全自由地使用它认为合适的 y 值;它不会做任何非法的事情,比如尝试使用 BigSecret 的名称

类型参数也是一样的。它们在逻辑上是传递给通用函数的参数。当然,它们在幕后并没有使用相同的机制传递,但从逻辑上讲,它们只是传递来设置类型参数值的参数,就像常规参数设置形式参数的值一样。如果您不想传递 secret 私有(private)类型,那么不要将其作为类型参数传递

在您的情况下,StoreTheData 不允许使用 PrivateClass 的名称,但如果传递了 PrivateClass 的,它可以随心所欲地使用它。如果您不想使用它,那么您就不应该传递它。就像您不想让 BigSecret 为人所知一样,那么您就不应该传递它。共享的 secret 不再是 secret 。

顺便说一句,我们利用泛型类型不对其类型参数进行可访问性检查这一事实来使匿名类型起作用。有关详细信息,请参阅我关于该主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2010/12/20/why-are-anonymous-types-generic.aspx

关于c# - 泛型方法如何知道不可访问的类型? (或 "How I Lost a Dollar"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5686642/

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